首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多線程同步利器:CountDownLatch 實戰詳解

     編輯:Java 相關知識

什麼是 CountDownLatch?

java.util.concurrent.CountDownLatch 是一個同步輔助類,允許一個或多個線程等待其他線程完成操作。它內部維護一個計數器,透過 countDown() 遞減,await() 阻塞直到計數歸零。

核心特性

  • 一次性使用:計數器無法重置,需重置請用 CyclicBarrier
  • 靈活同步:不要求呼叫 countDown 的線程等待,只阻塞 await 的線程
  • 多種模式:計數 1 當開關鎖;計數 N 等待 N 個任務完成

經典應用場景:賽跑模擬

裁判等選手就位 → 發令 → 選手跑完全程 → 裁判收集成績

public class CountdownLatchTest {
    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        
        // 裁判發令鎖 (計數 1)
        final CountDownLatch cdOrder = new CountDownLatch(1);
        // 選手完成鎖 (計數 3)
        final CountDownLatch cdAnswer = new CountDownLatch(3);

        // 3 位選手
        for (int i = 0; i < 3; i++) {
            service.execute(() -> {
                try {
                    System.out.println(Thread.currentThread().getName() + " 準備就緒");
                    cdOrder.await();  // 等待發令
                    System.out.println(Thread.currentThread().getName() + " 起跑");
                    Thread.sleep((long)(Math.random() * 10000)); // 模擬跑步
                    System.out.println(Thread.currentThread().getName() + " 到達終點");
                    cdAnswer.countDown(); // 完成計數 -1
                } catch (Exception e) { e.printStackTrace(); }
            });
        }

        // 裁判線程
        try {
            Thread.sleep((long)(Math.random() * 10000));
            System.out.println("裁判:發令!");
            cdOrder.countDown(); // 開閘
            
            System.out.println("裁判:等待選手到達...");
            cdAnswer.await(); // 阻塞直到計數歸零
            System.out.println("裁判:所有選手到達,比賽結束");
        } catch (Exception e) { e.printStackTrace(); }
        
        service.shutdown();
    }
}

執行結果範例

pool-1-thread-1 準備就緒
pool-1-thread-2 準備就緒
pool-1-thread-3 準備就緒
裁判:發令!
pool-1-thread-2 起跑
pool-1-thread-1 起跑
pool-1-thread-3 起跑
pool-1-thread-3 到達終點
pool-1-thread-1 到達終點
pool-1-thread-2 到達終點
裁判:所有選手到達,比賽結束

進階用法與注意事項

總結

CountDownLatch 是「一對多」或「多對一」同步的理想選擇,代碼簡潔、語義清晰。掌握其計數器模型,能輕鬆解決線程協調難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景做法
並行初始化多個服務主線程 await,各服務啟動後 countDown
分階段任務同步每階段建立新 CountDownLatch
需重複使用改用 CyclicBarrier 或 Phaser
超時控制使用 await(timeout, unit) 避免無限阻塞