兩個或多個線程互相持有對方需要的鎖,並請求對方持有的鎖,導致所有線程無限等待,系統無法推進。四個必要條件 (Coffman 條件):
public class DeadLockDemo {
private static final Object RESOURCE_1 = "R1";
private static final Object RESOURCE_2 = "R2";
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
synchronized (RESOURCE_1) {
System.out.println("Thread-1 locked R1");
sleep(50);
synchronized (RESOURCE_2) { // 等待 R2
System.out.println("Thread-1 locked R2");
}
}
}, "Thread-1");
Thread t2 = new Thread(() -> {
synchronized (RESOURCE_2) {
System.out.println("Thread-2 locked R2");
sleep(50);
synchronized (RESOURCE_1) { // 等待 R1
System.out.println("Thread-2 locked R1");
}
}
}, "Thread-2");
t1.start(); t2.start();
}
private static void sleep(long ms) { try { Thread.sleep(ms); } catch (InterruptedException ignored) {} }
}
Thread-1 locked R1
Thread-2 locked R2
// 程式卡住,無後續輸出 → 死鎖
t1 持有 R1 等 R2,t2 持有 R2 等 R1,形成循環等待。
| 工具 | 命令/操作 | 關鍵輸出 |
|---|---|---|
| jstack | jstack -l | Found one Java-level deadlock: 列出線程、鎖、堆棧 |
| jvisualvm / jconsole | GUI 連接進程 → Threads → Detect Deadlock | 圖形化展示死鎖鏈 |
| Arthas | thread -b (阻塞線程)、thread 看堆棧 | 生產環境無侵入診斷 |