考慮下面這個專門為說明多線程中的死鎖現象而構造的程序
import java
public class Stack {
public static void main(String[] args) {
final Stack stack = new Stack();
new Thread(
@Override
public void run() {
for(int i =
{
try {
Thread
} catch (InterruptedException e) {}
stack
}
}
}
new Thread(
@Override
public void run() {
for(int i =
{
try {
System
} catch (Exception e) {}
}
}
}
}
LinkedList<Object> list = new LinkedList<Object>();
public synchronized void push(Object x) {
System
synchronized (list) {
list
notify();
}
System
}
public synchronized Object pop() throws Exception {
System
synchronized (list) {
if (list
wait();
}
return list
}
}
}
該程序構造了一個 Stack
begin to pop
begin to push object
後
啟動 jvisualvm 查看該程序線程的狀態
at java
at Stack$
Locked ownable synchronizers:
at Stack$
Locked ownable synchronizers:
可以看到
步驟
主程序
pop 線程
push 線程
啟動
創建 stack 對象
創建 list 對象
啟動
啟動
sleep
調用 stack
鎖住 stack 對象
打印
鎖住 list 對象
調用 stack
(暫時釋放 stack 對象)
鎖住 stack 對象
打印
企圖鎖住 list 對象
(發現 list 已被其他線程鎖住)
進入死鎖狀態
原文地址 _zhongnan/blog/item/
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27384.html