1. 什么是死锁
- 死锁是不同线程分别占用对方需要的同步资源,都在等待对方放弃自己需要的资源,就形成了死锁
- 死锁发生的情况–以下四种情况同时发生的情况下才会发生死锁
-
互斥使用—不可破坏的条件
-
占有且等待
如果不能一次性申请所有资源就请等待(超时等待)
-
不可抢占
如果不能一次性申请所有资源,主动释放它占有的所有资源(超时放弃)
-
循环等待
先给资源排序,先申请资源序号小的,再申请资源序号大的,这样线性化后申请资源,解决循环等待
-
解决死锁的方法
-
预防死锁:,通过预先设置一些限定条件,破坏死锁的必要条件
-
避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全状态,从而避免死锁
-
检测死锁:允许死锁发生,但是一经检测,采取措施将死锁清除掉
-
解除死锁:与检测死锁配合使用
2. 测试
执行结果:线程持续阻塞,无法结束
查看死锁的方式
-
打开终端–在IDEA中是Terminal
-
查看阻塞端口 jsp
-
jstack 端口号
此时线程A想要获取0x000000076c210ed0
这个锁,被锁住的是0x000000076c210ee0
而线程B想要获取0x000000076c210ee0
这个锁,被锁住的是0x000000076c210ed0