A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hzhzhen 中级黑马   /  2015-5-15 23:29  /  560 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

谁能帮我总结出产生死锁的原因

3 个回复

倒序浏览
打个比方来说有两个门,有两把锁,你有一把,我有一把,你想要进我这个门,就需要我来开,而我想要进你那个门,就需要你来开,当我们都不开门的时候就只能在外面过夜啦!死锁一般出现在同步中嵌套同步时,有不同的锁,
回复 使用道具 举报
死锁原理:

线程1:

public void run(){

        synchronized(b){         // <1> 【先锁 b 再锁 a】

                sleep(1000);
               
                synchronized(a){        //<2>
                        ...
                }
        }
}

        线程2:

public void run(){

        synchronized(a){             //<3> 【先锁 a 再锁 b】

                sleep(1000);
               
                synchronized(b){      // <4>
                        ...
                }
        }
}

  前提:当一段代码被 synchronized 之后,只能有一条线程进入这段代码,当持有锁的线程执行了wait()或者执行完代码块之后,才会释放这个锁,让其他线程进入,否则其他线程不会进入到该代码

  当线程1执行到 <2> 时,线程2执行到 <4> ,此时 线程1持有了 b 锁, 等待 a 锁, 线程2 持有了 a 锁,等待 b 锁, 所以会出现死锁
回复 使用道具 举报
这是死锁产生的四个必要条件:1、互斥使用(资源独占)
一个资源每次只能给一个进程使用
2、不可强占(不可剥夺)
资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放
3、请求和保持(部分分配,占有申请)
一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)
4、循环等待
存在一个进程等待队列
{P1 , P2 , … , Pn},
其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路要想解除死锁就是要打破四个条件中的任意一个,常见的死锁解决算法,鸵鸟算法,银行家算法和资源分配图!

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马