Appearance
源码:labs/java/runtime-concurrency/deadlock-and-thread-dump/src/DeadlockDemo.java
- 原始路径:
labs/java/runtime-concurrency/deadlock-and-thread-dump/src/DeadlockDemo.java - 类型:
java
java
package deadlock;
/**
* 确定性双锁死锁演示:两个线程以相反顺序获取两把锁,必然互等。
*
* 运行:
* javac -d out src/DeadlockDemo.java
* java -cp out deadlock.DeadlockDemo &
* jstack <pid> # 观察 BLOCKED 与 "Found one Java-level deadlock"
*
* 修复练习:把 T2 也改成「先 lockA 再 lockB」,循环等待消失,死锁解除。
*/
public class DeadlockDemo {
private static final Object lockA = new Object();
private static final Object lockB = new Object();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
synchronized (lockA) {
log("T1 持有 lockA,准备申请 lockB");
sleep(500);
synchronized (lockB) {
log("T1 获得两把锁(不会发生)");
}
}
}, "Deadlock-T1");
Thread t2 = new Thread(() -> {
synchronized (lockB) {
log("T2 持有 lockB,准备申请 lockA");
sleep(500);
synchronized (lockA) {
log("T2 获得两把锁(不会发生)");
}
}
}, "Deadlock-T2");
t1.start();
t2.start();
t1.join();
t2.join();
log("正常结束(不会到达这里,因为已经死锁)");
}
private static void log(String msg) {
System.out.println("[" + Thread.currentThread().getName() + "] " + msg);
}
private static void sleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException ignored) {
// 演示用:忽略中断
}
}
}