semaphore通常用於限制可以訪問某些資源的執行緒陣列。semaphore稱為計數訊號量,它允許n個任務同時訪問某個資源,可以將訊號量看作是在向外分發使用資源的許可證,只有成功獲取許可證,才能使用資源。
demo
#利用semphore製作lock
public
static
void
lock()
throws interruptedexception
public
static
void
unlock()
catch
(exception e)
}
測試類
public
static
void
main
(string[
] args)
throws nosuchfieldexception, securityexception, illegalargumentexception, illegalacces***ception, interruptedexception
catch
(interruptedexception e)
finally}}
.start()
;}}
semaphore原始碼剖析
semaphore有兩種模式,公平模式和非公平模式。公平模式就是呼叫aquire的順序就是獲取許可證的順序,遵循fifo;而非公平模式是搶占式的。
sync
juc下的同步元件實現基本是依賴aqs的(同步元件通過複寫aqs中提供的方法,在其中進行對state屬性的判斷和設定進行同步語義的實現),semphore也不例外,我們先看下semaphore下的sync內部類。
abstract
static
class
sync
extends
abstractqueuedsynchronizer
//獲取許可
final
intgetpermits()
//共享模式下非公平獲取
//semaphore下的獲取鎖,可以理解為借用許可
final
intnonfairtryacquireshared
(int acquires)
}//共享模式下釋放
//semaphore中的釋放鎖可以理解為將之前借出去的許可**,所以是增加操作
protected
final
boolean
tryreleaseshared
(int releases)
}//減少semaphore可提供的許可
final
void
reducepermits
(int reductions)
}//獲取並立即返回可用的所有許可
final
intdrainpermits()
}}
nonfairsync
nonfairsync類繼承了sync類,表示採用非公平策略獲取資源
static
final
class
nonfairsync
extends
sync
//按照非公平策略進行資源的獲取
protected
inttryacquireshared
(int acquires)
}
fairsync
nonfairsync類繼承了sync類,表示採用公平策略獲取資源
static
final
class
fairsync
extends
sync
protected
inttryacquireshared
(int acquires)
}}
建構函式//傳入許可證個數
public
semaphore
(int permits)
//設定是否公平,預設非公平
public
semaphore
(int permits,
boolean fair)
獲取許可//獲取許可
public
void
acquire
(int permits)
throws interruptedexception
釋放許可public
void
release
(int permits)
小結
semaphore的使用一般由於限制對某個資源訪問的執行緒數碼。執行緒訪問需要獲取許可,即semaphore維護的"許可"-aqs中的state減少;執行緒結束訪問,返回許可,則"許可"增加。semaphore是共享鎖的一種,基於aqs的共享模式實現,在共享模式下的state表示占有該鎖的執行緒數目。
併發tools之訊號量Semaphore
前言 訊號量可以控制某個資源可以被同時訪問的個數,通過建構函式設定一定數量的許可 呼叫acquire 獲取乙個許可,如果沒有就等待 呼叫release 釋放乙個許可 實戰 下面例子只允許 個執行緒同時進入執行acquire 和release 之間的 public class semaphoredem...
併發程式設計回顧 訊號量Semaphore
原先多執行緒併發程式設計的學習筆記和 整理一下貼上來。訊號量semaphore 根據jdk文件描述 乙個計數訊號量。從概念上講,訊號量維護了乙個許可集。如有必要,在許可可用前會阻塞每乙個 acquire 然後再獲取該許可。每個 release 新增乙個許可,從而可能釋放乙個正在阻塞的獲取者。但是,不...
訊號量semaphore解析
1 基礎概念 訊號量在建立時須要設定乙個初始值,表示同一時候能夠有幾個任務能夠訪問該訊號量保護的共享資源。初始值為1就變成相互排斥鎖 mutex 即同一時候僅僅能有乙個任務能夠訪問訊號量保護的共享資源。乙個任務要想訪問共享資源,首先必須得到訊號量,獲取訊號量的操作將把訊號量的值減1。若當前訊號量的值...