java中提供的信號量操作由java.util.concurrent.Semaphore類實現
http://www.apihome.cn/api/java/Semaphore.html
public void acquire() throws InterruptedException
-
從此信號量獲取一個許可,在提供一個許可前一直將線程阻塞,否則線程被中斷。
獲取一個許可(如果提供了一個)並立即返回,將可用的許可數減 1。
如果沒有可用的許可,則在發生以下兩種情況之一前,禁止將當前線程用於線程安排目的並使其處於休眠狀態:
- 某些其他線程調用此信號量的 release() 方法,並且當前線程是下一個要被分配許可的線程;或者
- 其他某些線程中斷當前線程。
public boolean tryAcquire()
-
僅在調用時此信號量存在一個可用許可,才從信號量獲取許可。
獲取一個許可(如果提供了一個)並立即返回,其值爲
true
,將可用的許可數減 1。如果沒有可用的許可,則此方法立即返回並且值爲
false
。即使已將此信號量設置爲使用公平排序策略,但是調用
tryAcquire()
也將 立即獲取許可(如果有一個可用),而不管當前是否有正在等待的線程。在某些情況下,此“闖入”行爲可能很有用,即使它會打破公平性也如此。如果希望遵守公平設置,則使用 tryAcquire(0, TimeUnit.SECONDS) ,它幾乎是等效的(它也檢測中斷)。
public void release()
-
釋放一個許可,將其返回給信號量。
釋放一個許可,將可用的許可數增加 1。如果任意線程試圖獲取許可,則選中一個線程並將剛剛釋放的許可給予它。然後針對線程安排目的啓用(或再啓用)該線程。
不要求釋放許可的線程必須通過調用 acquire() 來獲取許可。通過應用程序中的編程約定來建立信號量的正確用法。