Java 中的死锁检测

2022-08-31 15:06:58

很久以前,我从Java参考书中保存了一句话:“Java没有处理死锁的机制。它甚至不会知道发生了死锁。“(Head First Java 2nd Edition, p.516)

那么,它是什么呢?有没有办法在Java中捕获死锁情况?我的意思是,有没有办法让我们的代码理解发生死锁的情况?


答案 1

从 JDK 1.5 开始,包中有非常有用的方法来查找和检查发生的死锁。请参阅类的 和 方法。java.lang.managementfindMonitorDeadlockedThreads()findDeadlockedThreads()ThreadMXBean

使用此功能的一种可能方法是使用单独的监视程序线程(或定期任务)来执行此操作。

示例代码:

  ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
  long[] ids = tmx.findDeadlockedThreads();
  if (ids != null) {
     ThreadInfo[] infos = tmx.getThreadInfo(ids, true, true);
     System.out.println("The following threads are deadlocked:");
     for (ThreadInfo ti : infos) {
        System.out.println(ti);
     }
  }

答案 2

JConsole 能够检测正在运行的应用程序中的死锁。