原始碼解析 Semaphore

2022-06-24 16:45:13 字數 1986 閱讀 3508

建立 semaphore 例項的時候,需要乙個引數 permits,

這個基本上可以確定是設定給 aqs 的 state 的,

然後每個執行緒呼叫 acquire 的時候,執行 state = state - 1,

release 的時候執行 state = state + 1,

當然,acquire 的時候,如果 state = 0,說明沒有資源了,需要等待其他執行緒 release。

基本操作

1.建立semaphore物件,初始化permits

2. semaphore.acquire()  占用乙個位置

3. semaphore.release() 取消乙個位置   

semaphore原理是aqs 可以理解成 就是多個物件共持有的一把鎖,達到permits數量 再想爭搶鎖就要等待,持有鎖的物件釋放。也區分公平鎖非公平鎖競爭原則

原始碼解析:

沒啥好說的   初始化設定aqs的state

2. acquire(int permits)  占用幾個空位的資源

acquiresharedinterruptibly()  老中斷處理了

if (tryacquireshared(arg) < 0) //說明佔位失敗  要麼是沒那麼多位置給你佔  要麼是cas失敗了
3. tryacquireshared()   非公平鎖的實現

死迴圈(){

獲取當前的state值;

remaining = state - 想要佔位數;

if(如果想要佔位數》state總數  或者cas成功 ){

返回剩餘位數;

4.  doacquiresharedinterruptibly()  佔位失敗,加入到阻塞佇列

將節點封裝成node 加入到阻塞佇列

for( 死迴圈){

判斷前直接點是不是頭節點;

如果前置節點是頭節點,嘗試去搶占位置,

搶占成功了,大吉大利 佇列中刪除節點,結束;

搶失敗了 掛起等待喚醒。

finally{

如果中途被中斷了 就退出爭搶 不玩了;

5. relase()  釋放資源

6. tryreleaseshared()  嘗試釋放共享資源   改state值

for(死迴圈){

獲取當前state值;

next = state + 要釋放的位置數;

cas交換

7. doreleaseshared()   喚醒所有等待的節點

Semaphore 原始碼解析

semaphore 訊號量 從概念上講,訊號量維護一套許可。每次 acquire 方法呼叫都會根據需要進行阻塞,直到獲得許可為止,然後將其占用。每次 release 方法呼叫都會新增乙個許可,可能會喚醒因沒有獲取到許可而阻塞的執行緒。semaphore 基於 aqs 實現,不熟悉 aqs 的同學可以...

Semaphore原始碼解析

public semaphore int permits public semaphore int permits,boolean fair permits 獲取許可的數量 fair 有公平和非公平 abstract static class sync extends abstractqueueds...

Semaphore訊號量原始碼解析

一 用法 訊號量,semaphore可以控同時訪問的執行緒個數,通過 acquire 獲取乙個許可,如果沒有就等待,而 release 釋放乙個許可。二 原始碼 構造方法,設定可以同時執行的執行緒數量。這裡可以設定是公平的,還是非公平的。這裡先說非公平的。acqurie 本質是aqs的方法,這個方法...