Long time ago, I saved a sentence from a Java reference book: "Java has no mechanism to handle deadlock. it won't even know deadlock occurred." (Head First Java 2nd Edition, p.516)
So, what is about it? Is there a way to catch deadlock case in Java? I mean, is there a way that our code understands a deadlock case occurred?
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);
}
}