【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相等的結果
}
}
相關推薦
【android】RxJava1原理解析
寫在前面 讀了大神的部落格,為了學習,跪著看完再整理了出來,以便加深印象。 RxJava 是什麼,能解決什麼問題 github 官方介紹 RxJava is a Java VM implementation of Reactive Ext
【countdownlatch】countdownlatch的原理解析
CountdownLatch的實現原理如下 設定建構函式的 【1】建構函式 public Countdownlatch(int count){ if(count<0){
【NLP】Attention原理和原始碼解析
對attention一直停留在淺層的理解,看了幾篇介紹思想及原理的文章,也沒實踐過,今天立個Flag,一天深入原理和原始碼!如果你也是處於attention model level one的狀態,那不妨好好看一下啦。 內容: 核心思想 原理解析(圖解+公式) 模型分類 優缺點 TF原始碼解析
【BIEE】分析的解析機制
order log biee 技術分享 idt 使用 目前 gin 感覺 今天使用BIEE時意外的發現個問題,BIEE在展示結果時候,是先進行排序,然後再展示。具體測試案例如下:首先,存在如下數據:在BIEE展示效果如下:目前是根據O1,02,03,04,05,06,07進
爬蟲實戰【6】Ajax內容解析-今日頭條圖集
就是 get請求 加載 執行 搜索 parse 編程 滾動 from Ajax技術 AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。 Ajax並不是新的編程語言,而是一種使用現有標準的新方法,當然也不
【Windows】Windows中解析DOS的for命令使用
文件打開 多少 command 忽略 文件的 mouseover 和數 參數 路徑 目錄結構: contents structure [+] 簡介 for /d ... in ... 案例 案例:打印C://根目錄下所有的文件夾名稱 案例
【Windows】Windows中解析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在各種開發中
【NLP】【七】fasttext原始碼解析
【一】關於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容器等優化
【總結】資料庫原理
(本文只是自己的學習總結,不一定正確,僅供參考) 文章目錄 資料庫通用概念 資料庫的產生 理論分類 關係資料庫 非關係資料庫 規模分類 記憶體型 文件型
【總結】作業系統原理
(本文只是自己的學習總結,不一定正確,僅供參考) 文章目錄 作業系統原理 基本內容 基本特徵 併發 分時(時間片輪轉) 共享
【 分類 】- 理論原理
專欄達人 授予成功建立個人部落格專欄
【 分類 】- 編譯原理
專欄達人 授予成功建立個人部落格專欄
【OpenCV】VideoCapture類解析
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