public class DeadLockDemo {
private static final Object HAIR_A = new Object();
private static final Object HAIR_B = new Object();
public static void main(String[] args) {
new Thread(() -> {
synchronized (HAIR_A) {
try {
Thread.sleep(50L);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (HAIR_B) {
System.out.println("A成功的抓住了B的头发");
}
}
}).start();
new Thread(() -> {
synchronized (HAIR_B) {
synchronized (HAIR_A) {
System.out.println("B成功抓住了A的头发");
}
}
}).start();
}
}
当我们不休眠那50毫秒,则死锁的情况不是100%发生,我们休眠那50毫秒之后
- 第一个线程先锁了
HAIR_A
,然后休眠50毫秒 - 此时第二个线程执行了,他拿到了
HAIR_B
,要去拿HAIR_A
的时候发现拿不到 - 这时第一个线程休眠结束,当他要拿
HAIR_B
时,发现HAIR_B
也拿不到
这个时候这两个线程一个等HAIR_A
释放,一个等HAIR_B
释放,进入了死锁状态