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