代码实现
public class DeadlockExample {
private static final Object ResourceA = new Object();
private static final Object ResourceB = new Object();
public static void main(String[] args) {
Thread Thread1 = new Thread(() -> {
synchronized (ResourceA) {
System.out.println("Thread1 获取了 ResourceA");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ResourceB) {
System.out.println("Thread1 获取了 ResourceB");
}
}
});
Thread Thread2 = new Thread(() -> {
synchronized (ResourceB) {
System.out.println("Thread2 获取了 ResourceB");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ResourceA) {
System.out.println("Thread2 获取了 ResourceA");
}
}
});
Thread1.start();
Thread2.start();
}
}
死锁原因分析
- 资源竞争:Thread1 和 Thread2 竞争 ResourceA 和 ResourceB 这两个资源。
- 加锁顺序不一致:Thread1 先获取 ResourceA 锁,再尝试获取 ResourceB 锁;而 Thread2 先获取 ResourceB 锁,再尝试获取 ResourceA 锁。
- 资源持有和等待:当 Thread1 获取 ResourceA 锁,Thread2 获取 ResourceB 锁后,两者都进入等待对方释放锁的状态,导致死锁。因为 Thread1 等待 Thread2 释放 ResourceB 锁,而 Thread2 等待 Thread1 释放 ResourceA 锁,双方都不会主动释放已持有的锁,从而形成死循环等待,造成死锁。