public
semaphore
(int permits)
public
semaphore
(int permits,
boolean fair)
permits:獲取許可的數量
fair:有公平和非公平
abstract
static
class
sync
extends
abstractqueuedsynchronizer
final
intgetpermits()
final
intnonfairtryacquireshared
(int acquires)
}protected
final
boolean
tryreleaseshared
(int releases)
}final
void
reducepermits
(int reductions)
}final
intdrainpermits()
}}/** * nonfair version
*/static
final
class
nonfairsync
extends
sync
protected
inttryacquireshared
(int acquires)
}/**
* fair version
*/static
final
class
fairsync
extends
sync
protected
inttryacquireshared
(int acquires)
}}
公平與非公平就有一行**的差別:
if
(hasqueuedpredecessors()
)return-1
;
hasqueuedpredecessors
方法用來檢測是否有等待的執行緒,如果有等待執行緒,此執行緒也會加入到等待佇列中,不會去搶state,而非公平沒有這行**,所以會和等待中的執行緒一起搶state。
public
void
acquire()
throws interruptedexception
public
final
void
acquiresharedinterruptibly
(int arg)
throws interruptedexception
內部呼叫的tryacquireshared()
方法,如果獲取狀態成功,返回剩餘的state,否則返回-1,返回-1時會加入等待佇列,阻塞
private
void
doacquiresharedinterruptibly
(int arg)
throws interruptedexception }if
(shouldparkafte***iledacquire
(p, node)
&&parkandcheckinterrupt()
)throw
newinterruptedexception()
;}}catch
(throwable t)
}
public
void
release()
public
final
boolean
releaseshared
(int arg)
return
false
;}
tryreleaseshared()
,為重寫的方法,增加state狀態的值,然後返回true,然後呼叫doreleaseshared()
方法,會喚醒頭結點後面等待的執行緒。
Semaphore 原始碼解析
semaphore 訊號量 從概念上講,訊號量維護一套許可。每次 acquire 方法呼叫都會根據需要進行阻塞,直到獲得許可為止,然後將其占用。每次 release 方法呼叫都會新增乙個許可,可能會喚醒因沒有獲取到許可而阻塞的執行緒。semaphore 基於 aqs 實現,不熟悉 aqs 的同學可以...
原始碼解析 Semaphore
建立 semaphore 例項的時候,需要乙個引數 permits,這個基本上可以確定是設定給 aqs 的 state 的,然後每個執行緒呼叫 acquire 的時候,執行 state state 1,release 的時候執行 state state 1,當然,acquire 的時候,如果 sta...
Semaphore訊號量原始碼解析
一 用法 訊號量,semaphore可以控同時訪問的執行緒個數,通過 acquire 獲取乙個許可,如果沒有就等待,而 release 釋放乙個許可。二 原始碼 構造方法,設定可以同時執行的執行緒數量。這裡可以設定是公平的,還是非公平的。這裡先說非公平的。acqurie 本質是aqs的方法,這個方法...