執行緒十八:Semaphore
阿新 • • 發佈:2018-12-11
Semaphore在java執行緒控制中通常被用作資源的限制訪問數量,如果我們想讓某個資源同時只能有一定數量的執行緒訪問,那麼我們就可以使用Semaphore來進行限制了。Semaphore將限制數量概念化成一個維護一組許可證的物件,我們可以通過構造器Semaphore(int permits)來初始化一個Semaphore物件,其中permits指定了許可證的數量。
許可證還存在一個公平策略的問題,因為資源本身被限制訪問,當有多個執行緒在等待訪問許可證時,如果採用非公平策略則不保證獲取許可證的順序,如果採用公平策略則按照先來先得的順序發放許可證。預設情況下,採用的是非公平策略,如果想使用公平策略,需要使用構造器Semaphore(int permits,boolean fair),當我們把fair設定為true時,就採用了公平策略。公平策略能防止執行緒被餓死,但是非公平策略的處理速度有優勢。
Semaphore提供了一系列方法來完成資源的限制訪問,詳細的方法描述建議大家檢視java doc文件,這裡面給出幾個最為常用的方法介紹:1.acquire方法獲取一個許可證,如果沒有可用的許可證則會阻塞。2.availablePermits方法返回當前可用許可證的數量。3.release方法釋放一個許可證,可用許可證的數量會加1.為了描述Semaphore的應用,我們看一個例子
例子中建立了三個執行緒來訪問一個被限制的資源Number,例子清晰地描述了Semaphore的使用。