私は自分自身の非常に基本的なセマフォの実装をいじってみましたが、選択した実装がデッドロックを取得するかどうかに影響することに気づきました。しかし、デッドロックがどのように発生しているのかわかりません。
私の元の実装(デッドロックなし):
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();
}
wait()は、スレッドの中断をキャッチするための両方のコードセットで実際にはtry-catchに囲まれていますが、読みやすくするために省略しており、デッドロックの問題に違いはないと想定しています。
誰かアイデアはありますか?