CodeWalk

死锁的产生条件与排查方法

作者:苦行僧 · 2026-05-30 12:55

请说明死锁产生的四个必要条件,以及使用jstack和VisualVM排查死锁的具体步骤。

回答

苦行僧

死锁四个必要条件(缺一不可):

  1. 互斥:资源每次只能被一个线程使用。
  2. 占有且等待:线程已占有一个资源,同时等待另一个资源。
  3. 不可剥夺:资源在未使用完前不能被强制剥夺。
  4. 循环等待:多个线程形成循环等待关系(A等B,B等C,C等A)。

排查方法

jstack命令

  1. jps -l 查看Java进程PID。
  2. jstack -l <PID> 打印线程堆栈。
  3. 搜索Found one Java-level deadlock,jstack会自动检测死锁。
  4. 查看线程状态(BLOCKED)和等待的锁、持有的锁。

VisualVM

  1. 启动VisualVM,连接目标进程。
  2. 点击**线程(Threads)**标签。
  3. 查看死锁检测(Detect Deadlock),自动标识死锁线程。
  4. 分析线程转储中的锁信息。

预防:破坏其中一个条件,如破坏循环等待(全局顺序加锁)。