В моем текущем назначении мы должны использовать Семафор для синхронизации доступа к критическим разделам. Тем не менее, предоставленная реализация меня спрашивает, правильно ли она реализована или нет. Я хочу, чтобы кто-то подтвердил мои заботы.Является ли эта реализация семафора неисправной?
public class Semaphore {
private int iValue;
public Semaphore(int piValue) {
this.iValue = piValue;
}
public Semaphore() {
this(0);
}
public synchronized boolean isLocked() {
return (this.iValue <= 0);
}
public synchronized void P() {
try {
while(this.iValue <= 0) {
wait();
}
this.iValue--;
} catch(InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void V() {
++this.iValue;
notifyAll();
}
}
Я считаю, что есть возможность для тупиковой ситуации в этом коде:
- Поток А вызывает
P()
иiValue
декрементируются 0. - Thread B вызовов
P()
прежде, чем поток А может вызыватьV()
, ЗначениеiValue
равно 0, поэтому он входит в цикл while. - Thread A теперь пытается вызвать
V()
, но не может, потому что поток B удерживает замок. Поэтому есть тупик.
Является ли мое заключение правильным?
Если бы это было так, как вы могли использовать 'wait'? –