執行緒流量控制工具之Semaphore

2022-08-04 10:57:12 字數 2070 閱讀 6732

簡介semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒,以保證合理的使用公共資源。很多年以來,我都覺得從字面上很難理解semaphore所表達的含義,只能把它比作是控制流量的紅綠燈,比如xx馬路要限制流量,只允許同時有一百輛車在這條路上行使,其他的都必須在路口等待,所以前一百輛車會看到綠燈,可以開進這條馬路,後面的車會看到紅燈,不能駛入xx馬路,但是如果前一百輛中有五輛車已經離開了xx馬路,那麼後面就允許有5輛車駛入馬路,這個例子裡說的車就是執行緒,駛入馬路就表示執行緒在執行,離開馬路就表示執行緒執行完成,看見紅燈就表示執行緒被阻塞,不能執行。

概述

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

相關方法:

public voidacquire()

throws interruptedexception

從此訊號量獲取乙個許可,在提供乙個許可前一直將執行緒阻塞,否則執行緒被中斷。獲取乙個許可(如果提供了乙個)並立即返回,將可用的許可數減 1。

如果沒有可用的許可,則在發生以下兩種情況之一前,禁止將當前執行緒用於執行緒安排目的並使其處於休眠狀態:

如果當前執行緒:

則丟擲interruptedexception,並且清除當前執行緒的已中斷狀態。 

丟擲:interruptedexception- 如果當前執行緒被中斷

public voidrelease()
釋放乙個許可,將其返回給訊號量。釋放乙個許可,將可用的許可數增加 1。如果任意執行緒試圖獲取許可,則選中乙個執行緒並將剛剛釋放的許可給予它。然後針對執行緒安排目的啟用(或再啟用)該執行緒。

不要求釋放許可的執行緒必須通過呼叫acquire()來獲取許可。通過應用程式中的程式設計約定來建立訊號量的正確用法。

相關例子:

下面的例子只允許5個執行緒同時進入執行acquire()和release()之間的**:

當其中乙個執行緒執行完成後(semp.release())後,會歸還許可,然後其他阻塞的執行緒就會拿到許可,然後繼續執行

public class semaphoretest catch (interruptedexception e)  

} }; 

exec.execute(run); 

} // 退出執行緒池

exec.shutdown(); } }

其他補充:semaphore semaccess = new semaphore(1, true);

將訊號量初始化為 1,使得它在使用時最多只有乙個可用的許可,從而可用作乙個相互排斥的鎖。這通常也稱為二進位制訊號量,因為它只能有兩種狀態:乙個可用的許可,或零個可用的許可。按此方式使用時,二進位制訊號量具有某種屬性(與很多lock實現不同),即可以由執行緒釋放「鎖」,而不是由所有者(因為訊號量沒有所有權的概念)。在某些專門的上下文(如死鎖恢復)中這會很有用。

此類的構造方法可選地接受乙個公平 引數。當設定為 false 時,此類不對執行緒獲取許可的順序做任何保證。特別地,闖入 是允許的,也就是說可以在已經等待的執行緒前為呼叫acquire()的執行緒分配乙個許可,從邏輯上說,就是新執行緒將自己置於等待執行緒佇列的頭部。當公平設定為 true 時,訊號量保證對於任何呼叫獲取方法的執行緒而言,都按照處理它們呼叫這些方法的順序(即先進先出;fifo)來選擇執行緒、獲得許可。注意,fifo 排序必然應用到這些方法內的指定內部執行點。所以,可能某個執行緒先於另乙個執行緒呼叫了acquire,但是卻在該執行緒之後到達排序點,並且從方法返回時也類似。還要注意,非同步的tryacquire方法不使用公平設定,而是使用任意可用的許可。

流量控制之GBN協議

停等協議的弊端 停等協議大多數時間都在等待 空閒 傳送的時間佔比比較低 浪費資源 太閒了 改善 1.現在要連續傳送多個幀,每個幀編號不同,便於出錯我們定位是哪乙個幀,因此幀的編號必須擴充。停等協議的緩衝區只有乙個,因為它一次只能傳送乙個幀,出錯的話,直接取緩衝區中唯一的乙個幀 但是採用連續傳送多個幀...

mysql流量控制 UDP流量控制之分析

關健字 udpudx udttcp 吞吐量流量 代寬擁塞控制 大都知道,udp是不可靠傳輸協議與tcp剛好相反.不過因為udp的特性適合傳輸不需要確認的資料,在應用層如果設計好的傳輸協議一樣可以進行很好的可靠傳輸.比如rudp協議.但是光可靠傳輸還不夠,流量控制是很重要的.我們從簡單的情況說起來說明...

流量控制原則

對於tcp ip一書中tcp部分,我認為關鍵要掌握3點 1.建鏈和拆鏈過程 2.資料互動規則 3.流量控制原則 針對這幾點,我進行了簡要概括,希望有助於初學者理解 流量控制原則 個人對於流量控制的理解,就是平衡一系列的矛盾,使資料 傳輸各方面的綜合成本最低。某個時間點,網路的容量或是某個連線的容量總...