[JAVA] 死锁的成因及解决思路

死锁:

——————————————————————————————————————————————————————————

代码/*


/**
@ author Jokers
@ version V 14.7.15

这是一个演示死锁的小练习。

*/

class Deadlock implements Runnable
{
        private boolean flag;
        Deadlock(boolean flag)
        {
                this.flag= flag;
        }

        public void run()
        {
                if(flag)
                {
                        synchronized(Mylock.locka)
                        {
                                System.out.println("if...locka..");
                                synchronized(Mylock.lockb)      
                                {
                                        System.out.println("if...lockb..");
                                }
                        }
                }

                else
                {
                        synchronized(Mylock.lockb)
                        {
                                System.out.println("else...lockb..");
                                synchronized(Mylock.locka)      
                                {
                                        System.out.println("else...locka..");
                                }
                        }
                
                }
        }
}

class Mylock
{
        static Object locka= new Object();
        static Object lockb= new Object();
        
}


class DeadlockTest
{
        public static void main(String[] args)
        {
                Deadlock lock_1=new Deadlock(true);
                Deadlock lock_2=new Deadlock(false);


                Thread t1= new Thread(lock_1);
                Thread t2= new Thread(lock_2);

                t1.start();
                t2.start();
        }
}


代码完*/

————————————————————————————————————————————————————————

这是一个用判断语句写的死锁嵌套小程序。

尤其可以简单的解释死锁产生的原因,死锁主要产生在同步嵌套中。简言之:


同步中嵌套同步,但锁不同。


上面的代码可以看出,两条线程开启了两段运行代码。但使用的锁却不是同一个,即(lockalockb)。


由于线程运行时间的随机性,导致当t1线程执行到synchronized(Mylock.locka){}时,

可能被CPU挂起,而此时t2线程开始执行并执行到synchronize(Mylock.lockb){}


这时t2线程就取得了lockb锁,而当t1线程开始恢复运行时,

执行到synchronize(Mylock.lockb){},就需要取得lockb锁,但此锁此时却在t2线程手中,而同理,当t2线程需要执行下面的语句,而锁却在t1手中,


自此就出现里两条线程都需要对方手中的锁,但却不释放自己的锁,导致两条线程出现死锁情况。


关于死锁的解决:

在网上能找到很多种解决方式,按照目前的知识量发现值得参考的是其中一种: 


保证每条线程有序的拿到锁


但尚未详解具体实现方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值