Skip to content

源码: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) {
            // 演示用:忽略中断
        }
    }
}

站点构建时间:2026/8/24 23:43:17