2015-03-02 56 views
2

我經歷this環節,這裏coiunting信號執行給定爲:如何實現信號

public class CountingSemaphore { 
    private int signals = 0; 

    public synchronized void take() { 
    this.signals++; 
    this.notify(); 
    } 

    public synchronized void release() throws InterruptedException{ 
    while(this.signals == 0) wait(); 
    this.signals--; 
    } 

} 

我不能夠得到那個。在take()方法中,通知被調用,這將使其他線程進入該部分。不應該在take方法中等待。請幫助我理解。

感謝

Jayendra

+0

爲什麼? JDK已經包含了一個。 – 2015-03-02 10:27:21

回答

3

該文章的第一個評論指出:

不要你 「吃」 和 「釋放」 逆轉嗎?

和筆者承認

你是對的,也許應該已經逆轉。

所以,是的,it seems the article got things mixed up a bit

如果您只是切換這兩種方法,它可能會起作用。

但是,在現實生活中,JDK現在在併發utils包中有信號量,您應該使用這些信號。

至於學習工作是如何工作的,首先將JDK源代碼作爲第一步,可能會有一定的挑戰性(但在您達成初步理解後仍有很好的閱讀能力)。最好找到更好的文章。

1

使用java.util.concurrent.Semaphore

計數信號量。從概念上講,信號量維護一套許可證。如果需要,每個獲取()都會阻止,直到獲得許可證爲止,然後將其獲取。每個版本()都添加一個許可證,可能會釋放一個阻止的收單機構。但是,沒有使用實際的許可證對象;信號量只是保持可用數量的計數,並據此採取行動。

Grep the code.

+1

這就是人們會做的,同意。但它沒有回答這個問題。 – Thilo 2015-03-02 10:26:54

+0

我知道它在jdk中,但我正在實現一個用於知識目的。請幫助我理解它。 – 2015-03-02 10:31:16

+0

閱讀源代碼。 – 2015-03-02 10:31:46

0

方法名稱由翻譯錯誤切換,請參閱原作者的評論。代碼在這種形式下沒有任何意義,因爲它會產生死鎖:釋放只會減少計數器,如果它是零,這將永遠不會再發生!

如果你調用調用,即通過調用'release'來鎖定,信號量將工作,但不會計數。