//死锁演示。 //新开一个线程进入a.x(),a被锁定;主线程进入b.y(),b被锁定。a进程访问b.last()方法,由于b被锁定,a被挂起;主线程访问a.last()方法,由于a被锁定,主线程被挂起。 class A { public synchronized void x(B b) { System.out.println("Enter a.x and a has been locked!/nPrepared to get into b.last..."); try { Thread.sleep(1000); //等待1000毫秒,制造死锁机会 } catch(Exception e) { System.out.println(e.getMessage()); } b.last(); //1000毫秒后调用b.last()。由于对象b的锁旗标已被b.y()所在的线程征用。所以a.x()所在的线程被挂起 } synchronized void last() { System.out.println("in a.last"); } } class B { public synchronized void y(A a) { System.out.println("Enter b.y and b has been locked!/nPrepared to get into a.last..."); try { Thread.sleep(1000); } catch(Exception e) { System.out.println(e.getMessage()); } a.last(); //调用a.last(),但是无法得到对象a的锁旗标,被挂起。由于a.x()所在的线程还在等待b.y的锁旗标,线程已挂起, } synchronized void last() { System.out.println("in b.last"); } } class DeadLock implements Runnable { A a=new A(); B b=new B(); DeadLock() //构建函数 { new Thread(this).start(); //新开线程,运行run()方法,调用a.x()方法,a被锁定 b.y(a); //调用b.y()方法,b被锁定 } public static void main(String [] args) { new DeadLock(); } public void run() { a.x(b); } }