定位死锁

定位死锁最常见的方式就是利用jstack等工具获取线程栈,然后定位互相之间的依赖关系,进而找到死锁。

如果程序运行时发生了死锁,绝大多数情况下都是无法在线解决的,只能重启、修正程序本身问题。所以,代码开发阶段互相审查,或者利用工具进行预防性排查。

如何在编程中尽量预防死锁呢?

尽量避免使用多个锁,并且只有在需要时才持有锁。

如果必须使用多个锁,尽量设计好锁的获取顺序。

使用带超时的方法,为程序带来更多可控性。

通过静态代码分析(如FindBugs)去查找固定的模式,进而定位可能的死锁或者竞争情况。