package com.salesforce.fault; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; public class DeadlockPoc { /** * @param args */ public static void main(String[] args) { final DeadlockPoc poc = new DeadlockPoc(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("method1 invoked"); poc.method1(); } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("method2 invoked"); poc.method2(); } } }).start(); 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); } } } public void method1(){ synchronized(String.class){ System.out.println("m1: Aquired lock on String.class object"); synchronized (Integer.class) { System.out.println("m1: Aquired lock on Integer.class object"); } } } public void method2(){ synchronized(Integer.class){ System.out.println("m2: Aquired lock on Integer.class object"); synchronized (String.class) { System.out.println("m2: Aquired lock on String.class object"); } } } }