Semphore原始碼解析

2021-08-19 21:27:05 字數 2433 閱讀 9469

semphore(訊號量)是用來控制同時訪問特定資源的執行緒數量。

那麼它到底是如何實現的呢,讓我們點開原始碼一**竟吧。

一、屬性變數

private final sync sync

;

屬性變數只有乙個,那就是sync類的物件

二、內部類

1、sync類

abstract static class sync extends abstractqueuedsynchronizer
可見sync類繼承與aqs,這個類實現訊號量的核心

2、nonfairsync類

static final class nonfairsync extends sync
具有不公平的訊號量

3、fairsync

static final class fairsync extends sync
具有公平性的訊號量

二、構造方法

public 

semaphore(int permits)

在只傳入訊號量個數的情況下,預設建立非公平的訊號量

public 

semaphore(int permits, boolean fair)

傳入訊號量個數並且還傳入了boolean型別的變數fair時,如果fiar為true建立公平訊號量,不然建立非公平的訊號量

三、操作方法

1、acquire方法

public void 

acquire() throws interruptedexception

public final void 

acquiresharedinterruptibly(int arg)

throws interruptedexception

這個方法用來獲取同步狀態,獲取成功執行緒便可執行臨界區的**,不然則等待其他執行緒對訊號量的釋放。

a、非公平訊號量的獲取

final int 

nonfairtryacquireshared(int acquires)

}

將訊號量減一,如果可用訊號量小於0則返回負數,如果大於0,則使用cas操作將訊號量個數減1

b、公平訊號量的獲取

protected int 

tryacquireshared(int acquires)

}

首先呼叫hashqueuedpredecessors方法,這個方法時判斷是否有執行緒比當前執行緒更早的請求同步狀態。其他步驟和非公平訊號量一致。

public final boolean 

hasqueuedpredecessors()

如果h不等t,說明同步佇列中有多個節點,並且頭結點的後繼節點如果不是當前執行緒,說明這個執行緒比當前更早的請求同步狀態,所以需要等待前驅執行緒獲取並釋放鎖之後才能繼續獲取鎖。

2、release方法

public void 

release(int permits)

release方法最後會呼叫semphore重寫的tryreleaseshared方法

protected final boolean 

tryreleaseshared(int releases)

}

tryreleaseshared方法執行步驟如下

1、獲取訊號量個數

2、訊號量個數加1

3、如果加1後的訊號量小於原先的訊號量,說明溢位了,所以丟擲異常

4、如果使用cas操作將訊號量個數更新為加1後的訊號量個數,則返回true,表示歸還訊號量成功。

四、應用

public static void 

main(string args) catch (exception e)finally }};

t1.start();

thread t2 = new thread()catch (exception e)finally }};

t2.start();

thread t3 = new thread()catch (exception e)finally }};

t3.start();

}

上述**定義了2個訊號量個數的semphore,說明同一時間最多只有兩個執行緒能夠進去執行**。執行結果如下圖所示。

可以看到,只有a執行緒和b執行緒進入了,而執行緒c卻被擋在門外,當a執行緒和b執行緒休眠到期後,結果如下圖所示

c進去了,並執行了**

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...

Integer原始碼解析

public class test else integer i3 200 integer i4 200 if i3 i4 else 結果為 原因integer 類會快取 128 到 127 之間的整數 但是如果new interger的話就是不同的物件了 源 分析 如果是在 128到正的127之間...