我一直在尝试实现自己的非常基本的信号量,并注意到我选择的实现会影响我是否遇到死锁。但我不明白僵局是如何发生的。
我的原始实现(没有死锁):
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 包围,用于捕获线程中断,但为了便于阅读,我将其省略了,并假设它对死锁问题没有影响。
有人有想法么?