Semaphore許可訪問類

2021-08-14 12:50:47 字數 1067 閱讀 5075

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

相關方法:

public voidacquire()

throws interruptedexception

從此訊號量獲取乙個許可,在提供乙個許可前一直將執行緒阻塞,否則執行緒被

中斷。獲取乙個許可(如果提供了乙個)並立即返回,將可用的許可數減 1。

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

如果當前執行緒:

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

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

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

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

相關例子:

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

public class semaphoretest  catch (interruptedexception e) finally }};

exec.execute(run);

}// 退出執行緒池

exec.shutdown();

}}

工具類Semaphore的實現分析

說起semaphor分析,停車場的例子都給說爛了,現在以技師服務為例進行分析,希望能給大家帶來更深刻的理解。乙個團隊的技師資源是有限的,所以客人爆滿時要進行限制。對於有限的資源要進行限流 控制,高效的提高技師工作效率,這就是semaphore的應用場景。具體實現流程如下圖 semaphore基於ab...

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

示例 如下 author snailclimb date 2018年9月30日 description 需要一次性拿乙個許可的情況 public class semaphoreexample1 catch interruptedexception e threadpool.shutdown syst...

遠端桌面不能訪問,許可授權問題

b 問題描述 b 在開發中有次因為伺服器搬了位置然後動了網絡卡的設定後導致了本機不能正常遠端到伺服器,其它機器又能正常訪問,這個問題其實是因為window自身一些遠端授權引起的 b 解決方式 b 是刪除乙個指定的登錄檔 color red hkey local machine software mi...