1. 程式人生 > >【countdownlatch】countdownlatch的原理解析

【countdownlatch】countdownlatch的原理解析

CountdownLatch的實現原理如下
設定建構函式的
【1】建構函式

public Countdownlatch(int count){
    if(count<0){
        throw new IllegalArgumentException("count<0");
    }
    this.sync = new Sync(count);
}

【2】await 函式

public void await() throws InterruptedException{
    sync.acquireSharedInterruptibly(1);
}
public
final void acquireSharedInterruptible(int arg)throw InterruptedException{ if(Thread.interrupted()){ throw new InterruptedException(); } if(tryAcquired(arg)<0){//嘗試獲取共享鎖 doAcquireSharedInterruptibly(arg);//實現執行緒的入列與阻塞 獲取共享鎖失敗 } }
protected int tryAcquiredShared(int acquires){
    return
(getState()==0)?1:-1; }
private void doAcquireSharedInterruptibly(int arg)throws InterruptedException{
    final Node node = addWariter(Node.Shared);//新增至等待佇列
    boolean failed = true;
    try{
        for(;;){
            final Node p = node.predecessor();
            if(p==head){//前驅節點為頭節點
                int
r = tryAcquireShared(arg); if(r>0){//獲取成功 //設定頭節點並進行反戰 setHeadAndPropagate(node,r); //設定節點next 域 p.next = null; failed = false; return; } } } } }

【3】countdown()方法
此函式將遞減鎖存器的計數,如果計數達到0,則釋放所有等待的執行緒。

public void countDown(){
    sync.releaseShared(1);//釋放共享鎖
}

releaseShared方法呼叫如下

//以共享模式釋放物件,並且函式種會呼叫到CountdownLatch的tryReleaseeShared函式
//並且可能會呼叫AQS的doreleaseShared函式,其中tryReleaseShared函式
public final boolean releaseShared(int arg){
    if(tryReleaseShared(arg)){//返回state減1以後,state==0的結果。如果是0,執行下面的程式碼
        doReleaseShared();//實現會喚醒第一個節點,第一個節點會喚醒第二個節點。
        return true;
    }
    return false;
}


//tryReleaseShared()的程式碼如下所示
protected boolean tryReleaseShared(int releases) {
            // Decrement count; signal when transition to zero
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;//返回當前state與0相等的結果
            }
        }

相關推薦

androidRxJava1原理解析

寫在前面 讀了大神的部落格,為了學習,跪著看完再整理了出來,以便加深印象。 RxJava 是什麼,能解決什麼問題 github 官方介紹 RxJava is a Java VM implementation of Reactive Ext

countdownlatchcountdownlatch原理解析

CountdownLatch的實現原理如下 設定建構函式的 【1】建構函式 public Countdownlatch(int count){ if(count<0){

NLPAttention原理和原始碼解析

對attention一直停留在淺層的理解,看了幾篇介紹思想及原理的文章,也沒實踐過,今天立個Flag,一天深入原理和原始碼!如果你也是處於attention model level one的狀態,那不妨好好看一下啦。 內容: 核心思想 原理解析(圖解+公式) 模型分類 優缺點 TF原始碼解析

BIEE分析的解析機制

order log biee 技術分享 idt 使用 目前 gin 感覺 今天使用BIEE時意外的發現個問題,BIEE在展示結果時候,是先進行排序,然後再展示。具體測試案例如下:首先,存在如下數據:在BIEE展示效果如下:目前是根據O1,02,03,04,05,06,07進

爬蟲實戰6Ajax內容解析-今日頭條圖集

就是 get請求 加載 執行 搜索 parse 編程 滾動 from Ajax技術 AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。 Ajax並不是新的編程語言,而是一種使用現有標準的新方法,當然也不

WindowsWindows中解析DOS的for命令使用

文件打開 多少 command 忽略 文件的 mouseover 和數 參數 路徑 目錄結構: contents structure [+] 簡介 for /d ... in ... 案例 案例:打印C://根目錄下所有的文件夾名稱 案例

WindowsWindows中解析DOS的DIR命令使用

命令 pat 分享 -h tro 名稱 鏈接 txt tle 總結一下cmd中的dir命令的用法 64位win10系統上,打印幫助文檔。 D:\test>dir /? 顯示目錄中的文件和子目錄列表。 DIR [drive:][path][filen

音訊wave格式解析

本文目的: 1、瞭解wave格式組成,瞭解wave頭各個部分組成 wav 格式,是微軟開發的一種檔案格式規範,整個檔案分為兩部分,第一部分是“檔案頭”,記錄重要的引數資訊,對於音訊而言,就包括:取樣率、通道數、位寬等等;第二部分是“資料塊”,即一幀一幀的二進位制資料,對於音訊而言,就是原始的

Java解決Gson解析資料時int自動轉化為double問題

Gson可以將json字串轉換時, 原json字串中的int , long型的數字會預設被轉換成double型別 , 導致數字會多一個小數點 , 如 1 會轉成 1.0。 解決方法: 只需將Gson gson = new Gson();換成下面這個  Gson gson = n

筆記計算機原理,網路,Linux作業系統

一,計算機原理 1,化繁為簡的思想,產生二進位制,產生把所有計算歸結為加法運算   二,網路 1,分層思想,產生ISO七層協議,商用了TCP/IP的五層協議   三,Linux作業系統 1,分層思想,硬體->作業系統->應用軟體 2,Linux一切皆檔案的思想

Android實現XML解析的幾種技術

轉載地址:http://www.cnblogs.com/hanyonglu/archive/2012/02/28/2370675.html  謝謝。 本文介紹在Android平臺中實現對XML的三種解析方式。   XML在各種開發中

NLPfasttext原始碼解析

【一】關於fasttext fasttext是Facebook開源的一個工具包,用於詞向量訓練和文字分類。該工具包使用C++11編寫,全部使用C++11 STL(這裡主要是thread庫),不依賴任何第三方庫。具體使用方法見:https://fasttext.cc/ ,在Linux 使用非常方便

原創JAVA面試解析(有贊一面)

本文的題目出自部落格 http://www.54tianzhisheng.cn/2018/07/12/youzan/ 但是作者沒有給出答案,博主斗膽來製作答案版。 引言 說在前面的話: 本文適合人群:急等著換工作的人 我承認刷面試題很有用的,縱觀幾年來的JAVA面試題,你會發現每家都差不多。比如,你仔細觀

jvm-從原理到實踐深入剖析jvm調優(小白也適用)

1.why? 為什麼要進行Jvm調優?因為jdk預設的jvm引數並不能很好的滿足每個專案的實際效能需求,因為不同的專案本身佔用記憶體cpu資源就不一樣,加上伺服器配置的多種多樣,jvm提供的初始引數很難達到定製的效果,在專案生產環境中,除了對程式碼,sql,web容器等優化

總結資料庫原理

(本文只是自己的學習總結,不一定正確,僅供參考) 文章目錄 資料庫通用概念 資料庫的產生 理論分類 關係資料庫 非關係資料庫 規模分類 記憶體型 文件型

總結作業系統原理

(本文只是自己的學習總結,不一定正確,僅供參考) 文章目錄 作業系統原理 基本內容 基本特徵 併發 分時(時間片輪轉) 共享

分類 - 理論原理

專欄達人 授予成功建立個人部落格專欄

分類 - 編譯原理

專欄達人 授予成功建立個人部落格專欄

OpenCVVideoCapture類解析

VideoCaputre 是OpenCV 中用來從攝像頭或視訊檔案或影象序列 來 獲取/處理視訊的類. Class for video capturing from video files, image sequences or cameras. The c

C++使用libxml解析XML檔案

1.     構建xmlDocPtr物件,xmlParseMemory(str,str.len) 字串轉為XML文件 , 從檔案讀取內容構建xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER) 2.     xmlDocG