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