public class DeadLocker implements Runnable { int field_1; private Object lock_1=new int[1]; int field_2; private Object lock_2=new int[1]; public void method1(int value){ synchronized (lock_1){ System.out.println(Thread.currentThread().getName()+ "lock1"); synchronized (lock_2){ field_1=0;field_2=0; } } } public void method2(int value){ synchronized (lock_2){ System.out.println(Thread.currentThread().getName()+ "lock2"); synchronized (lock_1){ field_1=0;field_2=0; } } } @Override public void run() { method1(2); method2(1); } public static void main(String[] args) { DeadLocker d=new DeadLocker(); Thread t1=new Thread(d,"Thread_monkey"); Thread t2=new Thread(d,"Thread dolphin"); t1.start(); t2.start(); } }
程序的运行会产生很多种不同的结果,有的是顺利执行完毕,大多数都会产生死锁:
1. Thread_monkey lock1
Thread_monkey lock2
Thread dolphin lock1
Thread dolphin lock2
这种是顺利执行完毕的。因为monkey线程执行完毕后dolphin才开始执行。这种可以忽略。
2. Thread_monkey lock1
Thread_monkey lock2
Thread dolphin lock1
monkey在执行到method2()的时候,dolphin正好开始执行。
此时dolphin进入到了method1()的synchronized (lock_1),而monkey则进入到了method2()的synchronized(lock_2)。
这时两个线程分别在之前的synchronized块中锁定了对方接下来所要锁定的资源。
既是:
线程 已锁定对象 需要对象
monkey -> lock_2 lock_1
dolphin-> lock_1 lock_2
两个线程都在锁定了对方所需要的对象,同时等待对方释放自己需要的对象。
程序进入死锁状态。
具体细节都在上面的链接里。