2014-08-29 57 views
3

請告訴信號量使用1和零初始化的區別是什麼。如下:信號量與1和0初始化的區別

public static Semaphore semOne = new Semaphore(1); 

public static Semaphore semZero = new Semaphore(0); 
+0

它指定*許可*。勾選[here](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html) – TheLostMind 2014-08-29 07:37:28

+0

@TheLostMind javadocs提到一個否定許可,但不是零 – 2014-08-29 07:38:43

+1

它的行爲與在許可證是否定的情況下。在調用acquire()之前,我們需要在信號量上調用release()。 – 2014-08-29 07:46:01

回答

5

到信號量實例的參數是可用「許可證」的數量。它可以是任意整數,不只是0或1

對於semZero所有acquire()調用將被阻塞和tryAcquire()調用將返回false,直到你做一個release()

semOne第一acquire()調用會成功,其餘將阻塞,直到第一個發佈。

該課程有詳細記錄here

參數:許可證 - 可用許可證的初始數量。這個 的值可能是負值,在這種情況下,必須在授予任何 獲取權之前發佈。

+0

一旦semzero被釋放,有多少線程可以獲取?是1嗎?基本上什麼是sem0ero允許的許可證 – developer 2018-02-11 04:31:35

3

構造參數permits(初始信號量計數器)是調用Semaphore.aquire()能夠之前所述計數器(許可證)製成是零,並且acquire()塊的數量。

是一個正常值,以確保只有一個線程通過獲取。

semaphore.acquire(); 
try { 
    // Critical region 
    ... 
} finally { 
    semaphore.release(); 
} 

對於的使用見here

信號量是一種低級併發機制:當達到零阻塞線程執行時的計數器。它起源於Dijkstra,其中二進制信號量(0,1)是鐵路信號量的一個比喻,用於表示傳遞(在0時停止,傳遞 - 許可),並且在受保護的軌道的末尾執行釋放(++允許)。

+0

semzero發佈後有多少線程可以獲取?是1嗎?基本上什麼是允許semzero – developer 2018-02-11 04:32:23

+0

@developer允許考慮'... acquire(); [Critical Section] release(); ...'將允許另一個'acquire()'(在第一次獲取後調用)通過。在計算機科學中,荷蘭Dijkstra使用了火車類比:信號量,P = passeren = try-pass/acquire,V = vrij maken = release。 – 2018-02-11 21:08:24