Semaphore 訊號量 允許多個執行緒同時訪問

2021-09-12 08:42:08 字數 1237 閱讀 9429

**synchronized 和 reentrantlock 都是一次只允許乙個執行緒訪問某個資源,semaphore(訊號量)可以指定多個執行緒同時訪問某個資源。**示例**如下:

/**

* * @author snailclimb

* @date 2023年9月30日

* @description: 需要一次性拿乙個許可的情況

*/public class semaphoreexample1 catch (interruptedexception e)

});}

threadpool.shutdown();

system.out.println("finish");

} public static void test(int threadnum) throws interruptedexception

}

執行acquire方法阻塞,直到有乙個許可證可以獲得然後拿走乙個許可證;每個release方法增加乙個許可證,這可能會釋放乙個阻塞的acquire方法。然而,其實並沒有實際的許可證這個物件,semaphore只是維持了乙個可獲得許可證的數量。 semaphore經常用於限制獲取某種資源的執行緒數量。

當然一次也可以一次拿取和釋放多個許可,不過一般沒有必要這樣做:

semaphore.acquire(5);// 獲取5個許可,所以可執行執行緒數量為20/5=4

test(threadnum);

semaphore.release(5);// 獲取5個許可,所以可執行執行緒數量為20/5=4

除了acquire方法之外,另乙個比較常用的與之對應的方法是tryacquire方法,該方法如果獲取不到許可就立即返回false。

semaphore 有兩種模式,公平模式和非公平模式。

semaphore 對應的兩個構造方法如下:

public semaphore(int permits) 

public semaphore(int permits, boolean fair)

這兩個構造方法,都必須提供許可的數量,第二個構造方法可以指定是公平模式還是非公平模式,預設非公平模式。

由於篇幅問題,如果對 semaphore 原始碼感興趣的朋友可以看下面這篇文章:

訊號量semaphore解析

1 基礎概念 訊號量在建立時須要設定乙個初始值,表示同一時候能夠有幾個任務能夠訪問該訊號量保護的共享資源。初始值為1就變成相互排斥鎖 mutex 即同一時候僅僅能有乙個任務能夠訪問訊號量保護的共享資源。乙個任務要想訪問共享資源,首先必須得到訊號量,獲取訊號量的操作將把訊號量的值減1。若當前訊號量的值...

Semaphore初識 java訊號量

朋友在寫 活動的時候,為了控制線程,用到了semaphore類 之前也是沒有用到過,就簡單認識一下它。semaphore,是負責協調各個執行緒,以保證它們能夠正確 合理的使用公共資源。也是作業系統中用於控制程序同步互斥的量。或者說,簡單的來講,就 是訊號量。比如我們去網咖開機子上網 原諒樓主是個網癮...

訊號量Semaphore學習總結

訊號量 semaphore 有時被稱為訊號燈,是在多執行緒環境下使用的一種設施,是可以用來保證兩個或多個關鍵 段不被併發呼叫。在進入乙個關鍵 段之前,執行緒必須獲取乙個訊號量 一旦該關鍵 段完成了,那麼該執行緒必須釋放訊號量。其它想進入該關鍵 段的執行緒必須等待直到第乙個執行緒釋放訊號量。為了完成這...