黑马程序员技术交流社区

标题: 为什么会产生死锁? [打印本页]

作者: hzhzhen    时间: 2015-5-15 23:29
标题: 为什么会产生死锁?
谁能帮我总结出产生死锁的原因
作者: meng12    时间: 2015-5-15 23:44
打个比方来说有两个门,有两把锁,你有一把,我有一把,你想要进我这个门,就需要我来开,而我想要进你那个门,就需要你来开,当我们都不开门的时候就只能在外面过夜啦!死锁一般出现在同步中嵌套同步时,有不同的锁,
作者: kingowe    时间: 2015-5-16 09:32
死锁原理:

线程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 锁, 所以会出现死锁

作者: qian0217wei    时间: 2015-5-16 12:02
这是死锁产生的四个必要条件:1、互斥使用(资源独占)
一个资源每次只能给一个进程使用
2、不可强占(不可剥夺)
资源申请者不能强行的从资源占有者手中夺取资源,资源只能由占有者自愿释放
3、请求和保持(部分分配,占有申请)
一个进程在申请新的资源的同时保持对原有资源的占有(只有这样才是动态申请,动态分配)
4、循环等待
存在一个进程等待队列
{P1 , P2 , … , Pn},
其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路要想解除死锁就是要打破四个条件中的任意一个,常见的死锁解决算法,鸵鸟算法,银行家算法和资源分配图!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2