外观
一句话答案
死锁四必要条件:互斥/占有等待/不可剥夺/循环等待,预防方式:破坏其中一个条件(如超时释放/按序申请)。
核心要点
预防:
- 破坏占有等待:一次性申请所有资源
- 破坏不可剥夺:超时释放
- 破坏循环等待:资源排序,按序申请
检测: 资源分配图 / jstack 线程 dump / SHOW ENGINE INNODB STATUS
追问与易错
追问方向:
- 怎么检测 Java 死锁?
- 数据库死锁和 Java 死锁排查区别?
- 哲学家就餐问题怎么解决?
易错点:
- ❌ 避免所有嵌套锁就不会死锁——顺序不一致也会
- ❌ 死锁只影响两个线程——可能是多线程循环等待
💡 记忆锚点
死锁像十字路口堵死:四个方向的车都占着路不让(互斥+占有等待+不可剥夺+循环等待),四个条件缺一不可。解法:要么一次性给所有路权(破坏占有等待),要么超时自动让路(破坏不可剥夺),要么规定只能按东南西北顺序走(破坏循环等待,按序申请锁)。