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


}