一、什么是死锁
二、死锁出现的原因
1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。
4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。
当上述四个条件都成立的时候,便形成死锁。当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。下面用java代码来模拟一下死锁的产生。
三、死锁案例
1 | public class DeadLock extends Thread { |
1 | public class DeadLockDemo { |
测试结果(一下结果只是所有结果中的一种):
1 | if objA |
原因分析:
出现上述结果是因为当线程 dl1 抢到CPU的执行权后,进入 if 语句块,使用了锁 objA,然后执行输出语句,但是这个时候被线程 dl2 抢到了CPU执行权,其执行 else 语句块,使用了锁 objB。然而,好景不长,线程 dl1 又将执行权抢了回来,当它准备执行输出语句后的代码时,发现锁 objB 已经被使用了,于是只能进入阻塞状态,等着线程 dl2 是释放锁 objB,所以,现在线程 dl2 拥有了执行权,可是它准备执行输出语句后的代码时,发现锁 objA 被线程 dl1 使用了。于是,它也只能等着线程 dl1 释放锁 objA。但是呢,这两个倔强的线程谁也不愿意释放自己已经拥有的锁,从而导致互相一直等待着对方释放资源。
四、死锁的解决
说实话避免死锁还得靠自己在写代码的时候注意一下;
这里引用一下别人的案例,不过我对于这些解决方法不是太懂。
Java新手,若有错误,欢迎指正!