class Test implements Runnable { private boolean flag; Test(boolean flag) { this.flag=flag; } public void run() { if (flag)//如果flag为ture,运行a,如果flag为false,运行B { while (true) { synchronized(MyLock.locka) { System.out.println("if locka"); synchronized(MyLock.lockb) { System.out.println("if lockb"); } } } } else { while (true) { synchronized(MyLock.lockb) { System.out.println("else lockb"); synchronized(MyLock.locka) { System.out.println("else locka"); } } } } } } class MyLock { public static final Object locka=new Object(); public static final Object lockb=new Object(); } class deadLockTest { public static void main(String[] args) { Test a=new Test(true); Test b=new Test(false); Thread t1=new Thread(a); Thread t2=new Thread(b); t1.start(); t2.start(); } }
运行结果如下,可以看到当只有第一个线程运行时,不会产生死锁问题,当t1线程完成第一个同步,获取到locka锁,CPU扫到t2线程,t2获取到lockb锁。这时,无论CPU扫到哪个线程,都无法进行下一个同步,因为t1和t2都无法获取下一个同步所需要的锁。