Semaphore原理分析

2022-02-11 07:45:35 字數 2386 閱讀 8692

:aqs-共享模式分析

訊號量semaphore是乙個控制訪問多個共享資源的計數器,和countdownlatch一樣,本質上是一種共享鎖。舉個例子,還是生產者消費者的例子,假設緩衝區的大小是100,然後可以實現多個生產者和消費者同時進行工作,只要100個資源沒有使用完,生產者就可以繼續生產,而在之前一篇文章分析condition的時候也舉了這個例子,那裡是使用reentrantlock + condition組合實現生產者消費者模型,一次只能有乙個生產者或者消費者進行生產或者消費,而使用semaphore就可以實現多個生產者消費者同時一起工作。

這個實現結構和reentrantlock一樣,分析如下:

//

不傳引數,預設是非公平方式

public semaphore(int

permits)

//通過引數控制公平的方式還是非公平

public semaphore(int permits, boolean

fair)

abstract

static

class sync extends

abstractqueuedsynchronizer

//獲取剩餘資源數量

final

intgetpermits()

//非公平獲取資源,採用死迴圈,如有剩餘資源,一直通過cas加鎖,直到成功為止

final

int nonfairtryacquireshared(int

acquires)

}//釋放鎖

protected

final

boolean tryreleaseshared(int

releases)

}//減少可用資源數量

final

void reducepermits(int

reductions)

}//將可用資源數量設定為0

final

intdrainpermits() }}

static

final

class nonfairsync extends

sync

//嘗試獲取共享鎖,呼叫上面sync中的方法

protected

int tryacquireshared(int

acquires)

}

static

final

class fairsync extends

sync

//公平的方式獲取共享資源,和非公平的方式最主要的區別就是多了乙個hasqueuedpredecessors方法,下面會分析這個方法

protected

int tryacquireshared(int

acquires) }}

進入abstractqueuedsynchronizer #hasqueuedpredecessors()

public

final

boolean

hasqueuedpredecessors()

對中斷敏感的方法

public

void acquire() throws

interruptedexception

這個就是呼叫上面實現的公平或者非公平實現類中獲取資源類中的方法,該方法對中斷敏感,就是當當前執行緒掛起的時候,發生了中斷,當再次喚醒的時候就會丟擲異常。

對中斷不敏感的方法

public

void

acquireuninterruptibly()

public

void

release()

//

嘗試獲取資源,如果沒有可用資源直接返回,如果有資源無限重試獲取資源

public

boolean

tryacquire()

//嘗試獲取資源,如果沒有可用資源,阻塞,在規定時間內沒有獲取到資源,就取消請求資源

public

boolean tryacquire(long

timeout, timeunit unit)

throws

interruptedexception

//判斷阻塞佇列中是否有等待的執行緒

public

final

boolean

hasqueuedthreads()

Semaphore原理分析

訊號量,個人理解它向乙個限制的意思,比如超過了某一設定好的標準就會無效,比如我們的在大學上學的時候,每年都舉行運動會,比如男子400公尺比賽,4個跑到,比如報名不足4個人則我們可以一次性跑完,但是如果多了,那麼多的只能等上一組跑完之後才能進行。閒話不多說,看下面幾個重要的實現。訊號量底層實際使用了a...

Semaphore原始碼分析

semaphore有兩種模式,公平模式和非公平模式。公平模式就是呼叫acquire的順序就是獲取許可證的順序,遵循fifo 而非公平模式是搶占式的,也就是有可能乙個新的獲取執行緒恰好在乙個許可證釋放時得到了這個許可證,而前面還有等待的執行緒。semaphore有兩個構造方法,如下 public se...

原始碼分析 Semaphore

計數訊號量,從概念上說,訊號量維持了一些許可。public class semaphoretest start protected void getinfo catch exception e finally 他會2每秒列印10個值,沒10個執行緒 獲取許可,其他執行緒會被阻塞在semaphore....