知识卡片
锁顺序致死锁
内容
需要同时持有多个锁时,不同线程若以不同顺序获取锁,就可能循环等待形成死锁。发散:凡是嵌套锁,都要把“所有路径是否同序获取”当成代码审查重点。
参考来源
- 位置:《你真的会写代码吗-2021》第8章《多个厨师一锅饭:线程安全》"8.2 处理死锁"(源文件:_epub-src/OEBPS/Text/0018.xhtml)
- 结论依据:原文明确"发生死锁的最简单场景是:线程1试图获取监视器A,再获取监视器B,而线程2则以相反的顺序获取。如果不走运,就可能导致线程1成功获取了监视器A,但线程2在线程1之前成功获取了监视器B。这时,线程就会陷入死锁",并以`a.connectTo(b)`与`b.connectTo(a)`并发调用为具体例子。
- 原始内容:发生死锁的最简单场景是:线程1试图获取监视器A,再获取监视器B,而线程2则以相反的顺序获取……这时,线程就会陷入死锁……如果一个线程调用a.connectTo(b),而另一个线程同时调用b.connectTo(a),就有可能出现典型的死锁情况。