Semaphore原始碼解析

2021-10-03 15:48:53 字數 2513 閱讀 3889

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的方法,這個方法...