併發程式設計回顧 訊號量Semaphore

2021-09-01 18:51:35 字數 1654 閱讀 1273

原先多執行緒併發程式設計的學習筆記和**整理一下貼上來。

訊號量semaphore

根據jdk文件描述:

乙個計數訊號量。從概念上講,訊號量維護了乙個許可集。如有必要,在許可可用前會阻塞每乙個 acquire(),然後再獲取該許可。每個 release() 新增乙個許可,從而可能釋放乙個正在阻塞的獲取者。但是,不使用實際的許可物件,semaphore 只對可用許可的號碼進行計數,並採取相應的行動。

個人理解為定義乙個訊號量同時指定它的許可數量,acquire時許可+1,release時許可-1。如果到達最大許可數時,後面的執行緒會阻塞。

乙個簡單的示例:

定義乙個列印資源id的任務。該任務在執行前先獲取訊號量的乙個許可,執行完後會釋放該許可。

class resourceinfo implements runnable

@override

public void run() catch(interruptedexception e)

}}

然後使用訊號量:
executorservice exec = executors.newcachedthreadpool();

semaphore semap=new semaphore(10);

for(int i=0;i<20;i++)

exec.shutdown();

這裡定義了乙個訊號量,最多允許10個任務獲取許可,然後一次啟動20個任務。執行結果如下:

resid:0

resid:2

resid:1

resid:3

resid:5

resid:6

resid:4

resid:7

resid:8

resid:9

resid:10

resid:11

resid:13

resid:12

resid:14

resid:16

resid:15

resid:17

resid:19

resid:18

前10個任務獲取到許可後,後面的10個任務會阻塞,直到前面的任務釋放許可。這裡我們修改一下:

semaphore semap=new semaphore(10,true);
指定公平設定(預設為false):如果此訊號量保證在爭用時按先進先出的順序授予許可,則為 true;否則為 false。再執行一下看看:

resid:0

resid:3

resid:2

resid:1

resid:4

resid:5

resid:7

resid:6

resid:8

resid:9

resid:10

resid:11

resid:12

resid:13

resid:14

resid:15

resid:16

resid:17

resid:18

resid:19

公平設定後,被阻塞的執行緒就會按照先進先出的順序獲得許可,因此,後面10個執行緒是順序列印id資訊的。

39 併發程式設計 訊號量

一 定義 1 互斥鎖同時只允許乙個執行緒更改資料,而訊號量semaphore是同時允許一定數量的執行緒更改資料 假設商場裡有4個迷你唱吧,所以同時可以進去4個人,如果來了第五個人就要在外面等待,等到有人出來才能再進去玩。2 實現 訊號量同步基於內部計數器,每呼叫一次acquire 計數器減1 每呼叫...

併發程式設計 資源併發訪問訊號量

如果執行緒要訪問乙個共享資源,它必須先獲得訊號量。如果訊號量的內部計數器大於0,訊號量將減1,然後允許訪問這個共享資源,計數器大於0意味著有可以使用的資源。因此執行緒將被允許訪問使用其中乙個資源。如果訊號量的計數器等於0,訊號量將會把執行緒置入休眠直至計數器大於0,計數器等於0的時候以為著所有共享資...

五 併發程式設計 程序訊號量

1.訊號量概念 相當於在鎖的基礎上增加計數器 鎖的概念一樣 只不過可以設定鑰匙的數量上述講的lock,屬於互斥鎖,也就是一把鑰匙配備一把鎖,同時只允許鎖住某乙個資料。而訊號量則是多把鑰匙配備多把鎖,也就是說同時允許鎖住多個資料。比如在乙個粉紅髮廊,裡邊有5位服務人員,那麼這個髮廊最多就同時允許進入5...