/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package quickie; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author bnevins */ public class DeadLock { public static void main(String... args) { if(args.length > 0) deadlock = true; try { new Thread(new T1("A")).start(); new Thread(new T2("B")).start(); new Thread(new T2("C")).start(); new Thread(new T1("D")).start(); new Thread(new T2("E")).start(); new Thread(new T1("F")).start(); } catch (Exception ex) { } } private static void sleep(int msec) { try { Thread.sleep(msec); } catch (InterruptedException ex) { // ignore } } private final static Object L1 = new Object(); private final static Object L2 = new Object(); private static boolean deadlock = false; private static class T1 implements Runnable { T1(String s) { name = s; } public void run() { while(true) { synchronized(L1) { System.out.println("T1-" + name + " got First"); sleep(10); synchronized(L2) { System.out.println("T1-" + name + " got Second"); sleep(10); } } sleep(2000); } } String name; } private static class T2 implements Runnable { T2(String s) { name = s; if(deadlock) { lock1 = L2; lock2 = L1; } else { lock1 = L1; lock2 = L2; } } public void run() { while(true) { synchronized(lock1) { System.out.println("T2-" + name + " got First"); sleep(10); synchronized(lock2) { System.out.println("T2-" + name + " got Second"); sleep(10); } } sleep(2000); } } String name; Object lock1, lock2; } }