摘要:線程可以調(diào)用的方法進(jìn)入阻塞,當(dāng)計數(shù)值降到時,所有之前調(diào)用阻塞的線程都會釋放。注意的初始計數(shù)值一旦降到,無法重置。
本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog...一、CountDownLatch簡介
CountDownLatch是一個輔助同步器類,用來作計數(shù)使用,它的作用有點類似于生活中的倒數(shù)計數(shù)器,先設(shè)定一個計數(shù)初始值,當(dāng)計數(shù)降到0時,將會觸發(fā)一些事件,如火箭的倒數(shù)計時。
初始計數(shù)值在構(gòu)造CountDownLatch對象時傳入,每調(diào)用一次 countDown() 方法,計數(shù)值就會減1。
線程可以調(diào)用CountDownLatch的await方法進(jìn)入阻塞,當(dāng)計數(shù)值降到0時,所有之前調(diào)用await阻塞的線程都會釋放。
注意:CountDownLatch的初始計數(shù)值一旦降到0,無法重置。如果需要重置,可以考慮使用CyclicBarrier。二、CountDownLatch使用示例
ContDownLatch一般有以下幾種用法:
1、作為一個開關(guān)/入口將初始計數(shù)值為1的 CountDownLatch 作為一個的開關(guān)或入口:
在調(diào)用 countDown() 的線程打開入口前,所有調(diào)用 await 的線程都一直在入口處等待。
public class Driver { private static final int N = 10; ? public static void main() throws InterruptedException { CountDownLatch switcher = new CountDownLatch(1); ? for (int i = 0; i < N; ++i) { new Thread(new Worker(switcher)).start(); } ? doSomething(); switcher.countDown(); // 主線程開啟開關(guān) ? } ? public static void doSomething() { } } ? class Worker implements Runnable { private final CountDownLatch startSignal; ? Worker(CountDownLatch startSignal) { this.startSignal = startSignal; } ? public void run() { try { startSignal.await(); //所有執(zhí)行線程在此處等待開關(guān)開啟 doWork(); } catch (InterruptedException ex) { } } void doWork() { ...} }2、作為一個完成信號
將初始計數(shù)值為N的 CountDownLatch作為一個完成信號點:使某個線程在其它N個線程完成某項操作之前一直等待。
public class Driver { private static final int N = 10; ? public static void main() throws InterruptedException { CountDownLatch compsignal = new CountDownLatch(N); ? for (int i = 0; i < N; ++i) { new Thread(new Worker(compsignal)).start(); } ? compsignal.await(); // 主線程等待其它N個線程完成 doSomething(); } ? public static void doSomething() { } } ? class Worker implements Runnable { private final CountDownLatch compSignal; ? Worker(CountDownLatch compSignal) { this.compSignal = compSignal; } ? public void run() { try { doWork(); compSignal.countDown(); //每個線程做完自己的事情后,就將計數(shù)器減去1 } catch (InterruptedException ex) { } } ? void doWork() { ...} }三、CountDownLatch類/接口聲明
類聲明:
構(gòu)造器:
接口:
關(guān)于CountDownLatch的內(nèi)部實現(xiàn)原理,讀者可以參考:
Java多線程進(jìn)階(九)—— J.U.C之locks框架:AQS共享功能剖析(4)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76620.html
摘要:好了,繼續(xù)向下執(zhí)行,嘗試獲取鎖失敗后,會調(diào)用首先通過方法,將包裝成共享結(jié)點,插入等待隊列,插入完成后隊列結(jié)構(gòu)如下然后會進(jìn)入自旋操作,先嘗試獲取一次鎖,顯然此時是獲取失敗的主線程還未調(diào)用,同步狀態(tài)還是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首發(fā)于一世流云的專欄:https://segmentfa...
摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據(jù)一系列常見的多線程設(shè)計模式,設(shè)計了并發(fā)包,其中包下提供了一系列基礎(chǔ)的鎖工具,用以對等進(jìn)行補充增強(qiáng)。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發(fā)于一世流云專欄:https...
摘要:二接口簡介可以看做是類的方法的替代品,與配合使用。當(dāng)線程執(zhí)行對象的方法時,當(dāng)前線程會立即釋放鎖,并進(jìn)入對象的等待區(qū),等待其它線程喚醒或中斷。 showImg(https://segmentfault.com/img/remote/1460000016012601); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 本系列文章中所說的juc-...
摘要:注意線程與本地操作系統(tǒng)的線程是一一映射的。固定線程數(shù)的線程池提供了兩種創(chuàng)建具有固定線程數(shù)的的方法,固定線程池在初始化時確定其中的線程總數(shù),運行過程中會始終維持線程數(shù)量不變。 showImg(https://segmentfault.com/img/bVbhK58?w=1920&h=1080); 本文首發(fā)于一世流云專欄:https://segmentfault.com/blog... ...
摘要:公平策略在多個線程爭用鎖的情況下,公平策略傾向于將訪問權(quán)授予等待時間最長的線程。使用方式的典型調(diào)用方式如下二類原理的源碼非常簡單,它通過內(nèi)部類實現(xiàn)了框架,接口的實現(xiàn)僅僅是對的的簡單封裝,參見原理多線程進(jìn)階七鎖框架獨占功能剖析 showImg(https://segmentfault.com/img/remote/1460000016012582); 本文首發(fā)于一世流云的專欄:https...
閱讀 1307·2021-10-08 10:04
閱讀 1940·2021-09-04 16:40
閱讀 2550·2019-08-30 13:21
閱讀 2292·2019-08-29 15:10
閱讀 2862·2019-08-29 12:35
閱讀 1201·2019-08-26 17:41
閱讀 3072·2019-08-26 17:03
閱讀 1154·2019-08-26 12:01