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傳入訊號量個數並且還傳入了boolean型別的變數fair時,如果fiar為true建立公平訊號量,不然建立非公平的訊號量semaphore(int permits, boolean fair)
三、操作方法
1、acquire方法
public voidacquire() throws interruptedexception
public final void這個方法用來獲取同步狀態,獲取成功執行緒便可執行臨界區的**,不然則等待其他執行緒對訊號量的釋放。acquiresharedinterruptibly(int arg)
throws interruptedexception
a、非公平訊號量的獲取
final int將訊號量減一,如果可用訊號量小於0則返回負數,如果大於0,則使用cas操作將訊號量個數減1nonfairtryacquireshared(int acquires)
}
b、公平訊號量的獲取
protected int首先呼叫hashqueuedpredecessors方法,這個方法時判斷是否有執行緒比當前執行緒更早的請求同步狀態。其他步驟和非公平訊號量一致。tryacquireshared(int acquires)
}
public final boolean如果h不等t,說明同步佇列中有多個節點,並且頭結點的後繼節點如果不是當前執行緒,說明這個執行緒比當前更早的請求同步狀態,所以需要等待前驅執行緒獲取並釋放鎖之後才能繼續獲取鎖。hasqueuedpredecessors()
2、release方法
public voidrelease方法最後會呼叫semphore重寫的tryreleaseshared方法release(int permits)
protected final booleantryreleaseshared方法執行步驟如下tryreleaseshared(int releases)
}
1、獲取訊號量個數
2、訊號量個數加1
3、如果加1後的訊號量小於原先的訊號量,說明溢位了,所以丟擲異常
4、如果使用cas操作將訊號量個數更新為加1後的訊號量個數,則返回true,表示歸還訊號量成功。
四、應用
public static void上述**定義了2個訊號量個數的semphore,說明同一時間最多只有兩個執行緒能夠進去執行**。執行結果如下圖所示。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();
}
可以看到,只有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之間...