java多線程的信號量Semaphore

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() 來獲取許可。通過應用程序中的編程約定來建立信號量的正確用法。

reducePermits()減少許可release()增加許可


發佈了42 篇原創文章 · 獲贊 3 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章