我一直在實現自己的基本信號量,並注意到我選擇的實現會影響我是否陷入僵局。但我不明白僵局是如何發生的。爲什麼使用繁忙等待的信號量會導致死鎖?
我最初的實現(無死鎖):
public synchronized void waitFor(){
value--;
if(value < 0)
wait();
}
public synchronized void signal(){
value++;
notify();
}
後來的實現(導致死鎖):
public synchronized void waitFor(){
value--;
while(value < 0)
wait();
}
public synchronized void signal(){
value++;
notifyAll();
}
的等待()實際上是由一個try-catch在兩組包圍用於捕獲線程中斷的代碼,但是爲了便於閱讀,我放棄了它,並假設它對死鎖問題沒有任何影響。
任何人有任何想法?
請使用信號量提供一個簡短的*完整*程序來演示問題。 (我們不知道你是否有足夠的線程發信號通知信號量,或者「this」是什麼......) – 2013-03-16 14:10:58
我不知道如何只用一個鎖就可以獲得死鎖......請注意,在你的第一個例子中你可能會錯過一個信號,因爲你使用'notify',並且你可能會因爲你的等待不在一個循環內而早早起牀。 – assylias 2013-03-16 14:14:45
最初的「價值」是什麼? – jtahlborn 2013-03-16 14:17:11