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