Deadlock detection in Java Deadlock detection in Java multithreading multithreading

Deadlock detection in Java


Since JDK 1.5 there are very useful methods in the java.lang.management package to find and inspect deadlocks that occurs. See the findMonitorDeadlockedThreads() and findDeadlockedThreads() method of the ThreadMXBean class.

A possible way to use this is to have a separate watchdog thread (or periodic task) that does this.

Sample code:

  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);     }  }


JConsole is able to detect deadlocks in a running application.


JDK 5 and 6 will dump held lock information in a full thread dump (obtained with kill -3, jstack, jconsole, etc). JDK 6 even contains information about ReentrantLock and ReentrantReadWriteLock. It is possible from this information to diagnose a deadlock by finding a lock cycle: Thread A holds lock 1, Thread B holds lock 2, and either A is requesting 2 or B is requesting 1. From my experience, this is usually pretty obvious.

Other analysis tools can actually find potential deadlocks even if they don't occur. Thread tools from vendors like OptimizeIt, JProbe, Coverity, etc are good places to look.