2010-09-29 22 views
0

接下來是一個簡單的信號量實現。如何解釋信號量處理操作?

public class Semaphore { 
    private boolean signal = false; 

    public synchronized void take() { 
    this.signal = true; 
    this.notify(); 
    } 

    public synchronized void release() throws InterruptedException { 
    while (!this.signal) wait(); 
    this.signal = false; 
    } 
} 

這是真的,是通過調用取()旗語模仿信號採集和喚醒隨機選擇的線程(如果它確實存在),並通過調用release(),如果沒有收購,旗語力電流信號(觸發)線程等待notify()但將信號採集設置爲false?

這是否意味着,如果我有3個線程的單個信號量,那麼我將不得不爲每個線程在線程安全的代碼部分運行take() - release()對?

回答

0

是的,寫的,take()會喚醒那些擋在release()隨機選擇的線程,release()將等待take()呼叫如果signal是入境假的。這表明您的名稱爲take()release()倒退:take()應該是阻止呼叫。

這是一個二進制信號量,因爲它只有兩個狀態。如果你像互斥體一樣使用它,那麼你將需要一個包裝需要被隔離的代碼的對。然而,在這種情況下,你最好用簡單的互斥體。

信號量有很多用途(請參閱「小信號燈」),但通常比互斥和監視器/條件變量更難正確使用。

+0

用過的互斥。謝謝你的建議! – 2010-09-29 23:33:40