玩轉併發 Semaphore訊號量

2021-09-12 03:37:54 字數 2615 閱讀 7568

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。若當前訊號量的值...