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

2021-10-13 13:27:48 字數 1517 閱讀 9242

示例**如下:

/**

** @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 有兩種模式,公平模式和非公平模式。

公平模式: 呼叫 acquire 的順序就是獲取許可證的順序,遵循 fifo;

非公平模式: 搶占式的。

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

public semaphore(int permits) 

public semaphore(int permits, boolean fair)

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

補充:semaphore與countdownlatch一樣,也是共享鎖的一種實現。它預設構造aqs的state為permits。當執行任務的執行緒數量超出permits,那麼多餘的執行緒將會被放入阻塞佇列park,並自旋判斷state是否大於0。只有當state大於0的時候,阻塞的執行緒才能繼續執行,此時先前執行任務的執行緒繼續執行release方法,release方法使得state的變數會加1,那麼自旋的執行緒便會判斷成功。

如此,每次只有最多不超過permits數量的執行緒能自旋成功,便限制了執行任務執行緒的數量。

以上就是本期更新內容,關注下期更精彩哦!

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

synchronized 和 reentrantlock 都是一次只允許乙個執行緒訪問某個資源,semaphore 訊號量 可以指定多個執行緒同時訪問某個資源。示例 如下 author snailclimb date 2018年9月30日 description 需要一次性拿乙個許可的情況 publ...

Ngnix 配置允許多個網域名稱跨域訪問

在nginx上的解決方案是配置access control allow origin來解決,但是此引數只允許配置單個網域名稱 add header access control allow origin baidu.com 或者 add header access control allow ori...

多執行緒是同時執行多個執行緒的嗎

相信多執行緒各位大佬都用過,不管是在單核cpu還是多核cpu上都可以執行,但是多執行緒是同時執行多個執行緒的嗎?併發和並行 併發 解釋1 當有多個執行緒在操作時,如果系統只有乙個cpu,則它根本不可能真正同時進行乙個以上的執行緒,它只能把cpu執行時間劃分成若干個時間段,再將時間 段分配給各個執行緒...