2015-10-28 3 views
-1

В моем текущем назначении мы должны использовать Семафор для синхронизации доступа к критическим разделам. Тем не менее, предоставленная реализация меня спрашивает, правильно ли она реализована или нет. Я хочу, чтобы кто-то подтвердил мои заботы.Является ли эта реализация семафора неисправной?

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(); 
    } 
} 

Я считаю, что есть возможность для тупиковой ситуации в этом коде:

  1. Поток А вызывает P() и iValue декрементируются 0.
  2. Thread B вызовов P() прежде, чем поток А может вызывать V() , Значение iValue равно 0, поэтому он входит в цикл while.
  3. Thread A теперь пытается вызвать V(), но не может, потому что поток B удерживает замок. Поэтому есть тупик.

Является ли мое заключение правильным?

+1

Если бы это было так, как вы могли использовать 'wait'? –

ответ

3

No.

При wait блокировка снимается (вы получите его обратно, когда ожидание закончилось).

Javadoc for wait:

Текущий поток должен владеть монитором данного объекта. Нить освобождает владельца этого монитора и ждет, пока другой поток не сообщит потокам, ожидающим на мониторе этого объекта, просыпаться либо через вызов метода уведомления, либо метод notifyAll. Затем поток ожидает, пока он не сможет повторно получить право собственности на монитор и возобновит выполнение.

Смежные вопросы