1.1 TestDeadLock.java #
public class TestDeadLock { public static void main(String[] args) { Lock l1 = new Lock(); Lock l2 = new Lock(); ThreadA ta = new ThreadA(l1, l2); ThreadB tb = new ThreadB(l1, l2); ta.start(); tb.start(); } }
1.3 ThreadA.java #
public class ThreadA extends Thread { private Lock lock1; private Lock lock2; public ThreadA(Lock lock1, Lock lock2) { this.lock1 = lock1; this.lock2 = lock2; } public void run() { synchronized(lock1){ System.out.println("A got lock : lock1"); try{ sleep(1000); } catch(Exception e){} synchronized(lock2){ System.out.println("A got lock : lock2"); } } } }
1.4 ThreadB.java #
public class ThreadB extends Thread { private Lock lock1; private Lock lock2; public ThreadB(Lock lock1, Lock lock2) { this.lock1 = lock1; this.lock2 = lock2; } public void run() { synchronized(lock2){ System.out.println("B got lock : lock2"); try{ sleep(1000); } catch(Exception e){} synchronized(lock1){ System.out.println("B got lock : lock1"); } } } }