最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的CountDownLatch多方面深入解析

 更新時(shí)間:2025年08月06日 08:57:25   作者:MOONNIFE  
CountDownLatch是Java中的一個(gè)并發(fā)工具類,它可以用于控制多個(gè)線程的并發(fā)執(zhí)行流程,這篇文章主要介紹了Java中的CountDownLatch的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

CountDownLatch 是 Java 并發(fā)包(java.util.concurrent)中的核心同步工具,用于協(xié)調(diào)多個(gè)線程的執(zhí)行順序,允許一個(gè)或多個(gè)線程等待其他線程組完成操作后再繼續(xù)執(zhí)行。其設(shè)計(jì)簡(jiǎn)潔高效,在企業(yè)級(jí)高并發(fā)場(chǎng)景中廣泛應(yīng)用。以下從核心特性、實(shí)現(xiàn)原理、企業(yè)實(shí)例三方面深入解析:

一、核心概念與特性??

  1. ??計(jì)數(shù)器機(jī)制??

    • ??初始化??:創(chuàng)建時(shí)指定正整數(shù) count(如 new CountDownLatch(5)),表示需要等待的事件數(shù)量。
    • ??遞減操作??:線程完成任務(wù)后調(diào)用 countDown(),計(jì)數(shù)器原子性減 1。
    • ??等待機(jī)制??:調(diào)用 await() 的線程阻塞,直到計(jì)數(shù)器歸零后自動(dòng)喚醒。
  2. ??關(guān)鍵方法??

    • await():阻塞當(dāng)前線程直至計(jì)數(shù)器歸零(支持中斷)。
    • await(long timeout, TimeUnit unit):支持超時(shí)等待,避免無限阻塞。
    • countDown():計(jì)數(shù)器減 1,歸零時(shí)喚醒所有等待線程。
    • getCount():獲取當(dāng)前計(jì)數(shù)器值(調(diào)試或監(jiān)控用)。
  3. ??核心特性??

    • ??一次性??:計(jì)數(shù)器歸零后無法重置,若需復(fù)用需改用 CyclicBarrier。
    • ??無鎖設(shè)計(jì)??:基于 AQS 實(shí)現(xiàn),countDown() 通過 CAS 操作避免鎖競(jìng)爭(zhēng)。

二、底層實(shí)現(xiàn)原理??

??基于 AQS(AbstractQueuedSynchronizer)的共享鎖模式??:

  1. ??Sync 內(nèi)部類??:

    • 繼承 AQS,重寫 tryAcquireSharedtryReleaseShared 方法。
    • ??tryAcquireShared??:計(jì)數(shù)器為 0 時(shí)返回 1(允許線程通過),否則返回 -1(阻塞線程)。
    • ??tryReleaseShared??:
      protected boolean tryReleaseShared(int releases) {
          for (;;) { // CAS 自旋減計(jì)數(shù)
              int c = getState();
              if (c == 0) return false;
              int nextc = c-1;
              if (compareAndSetState(c, nextc)) 
                  return nextc == 0; // 返回 true 時(shí)喚醒阻塞線程
          }
      }
      ```[7](@ref)  
  2. ??線程阻塞與喚醒??:

    • ??await()?? → 調(diào)用 acquireSharedInterruptibly(1),線程加入 AQS 阻塞隊(duì)列。
    • ??countDown()?? → 計(jì)數(shù)器歸零時(shí),AQS 釋放所有阻塞線程(通過 doReleaseShared())。
  3. ??性能優(yōu)勢(shì)??:

    • countDown() 無鎖操作(CAS),高并發(fā)下效率高;
    • 線程喚醒由 AQS 統(tǒng)一調(diào)度,避免“驚群效應(yīng)”。

三、企業(yè)級(jí)應(yīng)用場(chǎng)景與實(shí)例??

??場(chǎng)景 1:微服務(wù)啟動(dòng)協(xié)調(diào)??

??問題??:系統(tǒng)需依賴多個(gè)服務(wù)(數(shù)據(jù)庫、緩存、消息隊(duì)列)啟動(dòng)完成后,主服務(wù)才能對(duì)外提供服務(wù)。

??解決方案??:

public class ServiceBootstrap {
    private static final int SERVICE_COUNT = 3;
    private static CountDownLatch latch = new CountDownLatch(SERVICE_COUNT);
 
    public static void main(String[] args) {
        // 啟動(dòng)依賴服務(wù)
        startService("Database", 2000);
        startService("Redis", 1500);
        startService("MQ", 1000);
 
        try {
            latch.await(); // 阻塞主線程,等待所有服務(wù)就緒
            System.out.println("所有服務(wù)啟動(dòng)完成,主服務(wù)開始運(yùn)行!");
        } catch (InterruptedException e) { /* ... */ }
    }
 
    private static void startService(String name, long delay) {
        new Thread(() -> {
            try {
                Thread.sleep(delay); // 模擬服務(wù)初始化
                System.out.println(name + " 服務(wù)就緒");
            } catch (Exception e) { /* ... */ } finally {
                latch.countDown(); // 服務(wù)就緒后減計(jì)數(shù)
            }
        }).start();
    }
}

??輸出??:

Redis 服務(wù)就緒  
MQ 服務(wù)就緒  
Database 服務(wù)就緒  
所有服務(wù)啟動(dòng)完成,主服務(wù)開始運(yùn)行!
```[4,7](@ref)  
 
---
 
#### ?? **場(chǎng)景 2:電商詳情頁數(shù)據(jù)聚合**  
**問題**:商品詳情頁需并行調(diào)用交易服務(wù)(價(jià)格)、庫存服務(wù)(庫存)、推薦服務(wù)(相關(guān)商品),全部返回后才能渲染頁面。  
**解決方案**:  
```java
public class ProductDetailService {
    private CountDownLatch latch = new CountDownLatch(3);
    private PriceResult priceResult;
    private StockResult stockResult;
    private RecommendResult recommendResult;
 
    public void loadDetail() throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(3);
        executor.submit(() -> {
            priceResult = fetchPrice(); // 調(diào)用價(jià)格服務(wù)
            latch.countDown();
        });
        executor.submit(() -> {
            stockResult = fetchStock(); // 調(diào)用庫存服務(wù)
            latch.countDown();
        });
        executor.submit(() -> {
            recommendResult = fetchRecommends(); // 調(diào)用推薦服務(wù)
            latch.countDown();
        });
 
        latch.await(500, TimeUnit.MILLISECONDS); // 超時(shí) 500ms 避免頁面卡死
        renderPage(priceResult, stockResult, recommendResult);
    }
}

??優(yōu)勢(shì)??:

  • 并行請(qǐng)求減少響應(yīng)時(shí)間(從串行 300ms → 并行 150ms);
  • 超時(shí)機(jī)制保障服務(wù)降級(jí)能力。

場(chǎng)景 3:分布式任務(wù)分治??

??問題??:日志分析系統(tǒng)需將 10GB 日志拆分為 100 個(gè)子任務(wù)并行處理,全部完成后匯總結(jié)果。

??解決方案??:

public class LogAnalyzer {
    private static final int TASK_COUNT = 100;
    private CountDownLatch latch = new CountDownLatch(TASK_COUNT);
    private ResultAggregator aggregator = new ResultAggregator();
 
    public void analyze() {
        for (int i = 0; i < TASK_COUNT; i++) {
            Thread task = new Thread(() -> {
                TaskResult result = processSubTask(); // 處理子任務(wù)
                aggregator.collect(result);
                latch.countDown();
            });
            task.start();
        }
 
        latch.await(); // 阻塞主線程直至所有任務(wù)完成
        aggregator.summarize(); // 生成最終報(bào)告
    }
}

??適用場(chǎng)景??:

  • 大數(shù)據(jù)分片處理(如 MapReduce 中的 Map 階段同步);
  • 批量訂單并發(fā)處理后的庫存結(jié)算。

??四、注意事項(xiàng)與替代方案??

  1. ??不可重用性??:
    計(jì)數(shù)器歸零后無法重置,需根據(jù)場(chǎng)景選擇:

    • ??單次等待??:CountDownLatch(如服務(wù)啟動(dòng));
    • ??循環(huán)同步??:CyclicBarrier(如分階段計(jì)算)。
  2. ??超時(shí)控制??:
    務(wù)必使用 await(long timeout, TimeUnit unit),避免線程永久阻塞導(dǎo)致系統(tǒng)僵死。

  3. ??異常處理??:

    • 子線程異常時(shí)需在 finally 塊調(diào)用 countDown(),防止主線程無限等待;
    • 中斷響應(yīng):await() 被中斷后拋出 InterruptedException,需重置中斷狀態(tài)。
  4. ??性能監(jiān)控??:
    通過 getCount() 實(shí)時(shí)監(jiān)控未完成任務(wù)數(shù),結(jié)合日志定位瓶頸。

總結(jié)??

CountDownLatch 以 ??“計(jì)數(shù)器歸零”?? 為核心模型,通過 AQS 的共享鎖機(jī)制實(shí)現(xiàn)高效線程協(xié)調(diào),適用于三類企業(yè)場(chǎng)景:

  1. ??服務(wù)啟動(dòng)依賴??(等待多個(gè)組件初始化完成);
  2. ??并行任務(wù)聚合??(如數(shù)據(jù)分片處理、微服務(wù) API 組合);
  3. ??分布式任務(wù)同步??(批量任務(wù)完成后觸發(fā)匯總操作)。

其設(shè)計(jì)精髓在于 ??以無鎖 CAS 實(shí)現(xiàn)高并發(fā)計(jì)數(shù)??,但需警惕不可重用性與超時(shí)風(fēng)險(xiǎn)。對(duì)于復(fù)雜多階段協(xié)作,可結(jié)合 CompletableFutureCyclicBarrier 擴(kuò)展功能。

到此這篇關(guān)于Java中CountDownLatch的文章就介紹到這了,更多相關(guān)Java中CountDownLatch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • logback的ShutdownHook關(guān)閉原理解析

    logback的ShutdownHook關(guān)閉原理解析

    這篇文章主要為大家介紹了logback的ShutdownHook關(guān)閉原理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲

    java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java?mapToInt()方法使用小結(jié)

    Java?mapToInt()方法使用小結(jié)

    本文介紹了Java?8中Stream?API中的mapToInt()方法,它可以將對(duì)象流轉(zhuǎn)換為整型流,從而方便地進(jìn)行求和、求平均值、求最大值/最小值等操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-11-11
  • 深入Java?ThreadLocal核心原理與內(nèi)存泄漏解決方案

    深入Java?ThreadLocal核心原理與內(nèi)存泄漏解決方案

    這篇文章主要介紹了深入闡述了ThreadLocal的底層實(shí)現(xiàn)機(jī)制,即通過每個(gè)線程內(nèi)部維護(hù)的ThreadLocalMap的哈希表來存儲(chǔ)數(shù)據(jù),從而為每個(gè)線程提供獨(dú)立的變量副本,實(shí)現(xiàn)線程隔離,關(guān)鍵點(diǎn)在于其Entry的Key是弱引用,而Value是強(qiáng)引用,這直接引出了內(nèi)存泄漏問題,需要的朋友可以參考下
    2026-01-01
  • Java編程實(shí)現(xiàn)帕斯卡三角形代碼示例

    Java編程實(shí)現(xiàn)帕斯卡三角形代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)帕斯卡三角形代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Spring activiti如何實(shí)現(xiàn)指定任務(wù)處理者

    Spring activiti如何實(shí)現(xiàn)指定任務(wù)處理者

    這篇文章主要介紹了Spring activiti如何實(shí)現(xiàn)指定任務(wù)處理者,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 使用Maven打包、發(fā)布、配置版本號(hào)命令

    使用Maven打包、發(fā)布、配置版本號(hào)命令

    在軟件開發(fā)過程中,打包和發(fā)布是關(guān)鍵步驟,本文介紹了如何在打包和發(fā)布時(shí)跳過測(cè)試,如何指定項(xiàng)目版本號(hào),以及如何指定配置文件,提供了實(shí)用的技巧和方法,希望對(duì)開發(fā)者有所幫助
    2024-09-09
  • Apache commons fileupload文件上傳實(shí)例講解

    Apache commons fileupload文件上傳實(shí)例講解

    這篇文章主要為大家詳細(xì)介紹了Apache commons fileupload文件上傳實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Mybatis自定義SQL的關(guān)系映射、分頁、排序功能的實(shí)現(xiàn)

    Mybatis自定義SQL的關(guān)系映射、分頁、排序功能的實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis自定義SQL的關(guān)系映射、分頁、排序功能的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • java從文件中讀取數(shù)據(jù)的六種方法

    java從文件中讀取數(shù)據(jù)的六種方法

    本文主要介紹了java從文件中讀取數(shù)據(jù)的方法,詳細(xì)的介紹了六種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

河源市| 沿河| 平定县| 博罗县| 茶陵县| 巫溪县| 从江县| 阿坝| 凌源市| 阿巴嘎旗| 新津县| 安龙县| 双柏县| 芦山县| 南城县| 永州市| 天镇县| 华宁县| 灵台县| 石渠县| 都昌县| 雷州市| 井冈山市| 思南县| 清丰县| 二手房| 色达县| 金乡县| 台前县| 军事| 仁寿县| 安平县| 南康市| 南部县| 克山县| 商城县| 陵川县| 繁昌县| 镇雄县| 尼勒克县| 福鼎市|