首先要满足一个必要条件就是
两个线程,每个线程都获取了其中的一个锁,但为了完成工作,还需对方的另一个锁。
上代码
import java.util.Arrays; import java.util.List; public class DeadLock { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(4, 5, 6); new Thread(new Runnable() {//看做是线程1 @Override public void run() { synchronized (list1){ for (Integer i:list1) { System.out.println(i); } try { Thread.sleep(1000);// 123已经打印完毕,当前线程Thread休息1000秒 } catch (InterruptedException e) { } synchronized (list2){ System.out.println("线程1的代码执行到了这里"); for (Integer i:list2) { System.out.println(i); } } } } }).start(); new Thread(new Runnable() {//看作是线程2 @Override public void run() { synchronized (list2){ for (Integer i:list2) { System.out.println(i);//456会在这里打印 } try { Thread.sleep(1000); } catch (InterruptedException e) { } synchronized (list1){ System.out.println("线程2的代码执行到这里"); for (Integer i:list1) { System.out.println(i); } } } } }).start(); } }
看执行结果
根据代码的运行结果可以看出来就是线程1和线程2的第二部分代码并没有执行
这说明线程1拥有实例list1的锁在等待线程2释放实例list2的锁
而此刻线程2拥有实例list2的锁在等待线程1释放实例list1的锁
这就很尴尬
这就好像我被反锁在了房间1,我有房间2的钥匙,你被反锁在了房间 2,你有房间1的钥匙,
我们都在互相等待对方给自己钥匙开门,但是我们都无法打开自己的房门(就像两个线程都无法释放自己当前持有的锁)