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

Java CountDownLatch 實戰:精確控制並發測試啟動、實現真正的同時併發

     編輯:Java 相關知識

普通 for 循環啟動線程無法保證同時執行。CountDownLatch(倒數閂)通過「等待計數歸零」機制,實現多線程精確同步啟動,是並發測試、壓力測試的標準工具。

一、 核心原理

  • 初始化計數器 N。
  • countDown():計數器 -1,非阻塞。
  • await():阻塞直到計數器歸零。
  • 一次性使用,不可重置(需重置用 CyclicBarrier)。

二、 並發測試標準模板

public class ConcurrentTest {
    public static void main(String[] args) throws InterruptedException {
        int threadCount = 1000;
        CountDownLatch startGate = new CountDownLatch(1); // 起跑線
        CountDownLatch endGate = new CountDownLatch(threadCount); // 終點線

        for (int i = 0; i < threadCount; i++) {
            new Thread(() -> {
                try { startGate.await(); } // 等待開槍
                catch (InterruptedException e) { return; }
                try { httpRequest("https://target/api"); } // 業務邏輯
                finally { endGate.countDown(); }
            }).start();
        }

        Thread.sleep(2000); // 確保所有線程就緒
        long start = System.nanoTime();
        startGate.countDown(); // 開槍!所有線程同時啟動
        endGate.await(); // 等待全部結束
        long elapsed = System.nanoTime() - start;
        System.out.printf("併發 %d 請求耗時 %.2f ms, QPS %.0f%n",
                threadCount, elapsed / 1e6, threadCount / (elapsed / 1e9));
    }

    private static void httpRequest(String url) {
        // 實際 HTTP 調用邏輯
    }
}

三、 兩把閂的角色

閂計數await 方countDown 方作用
startGate1所有工作線程主線程保證「同時起跑」
endGateN主線程所有工作線程保證「全部分統計」

四、 進階變體

  • 分批啟動:多個 startGate,模擬漸增負載。
  • 超時控制:endGate.await(30, TimeUnit.SECONDS) 防止卡死。
  • 統計聚合:工作線程將耗時/狀態寫入 ConcurrentLinkedQueue 或 LongAdder,主線程彙總輸出百分位數。

五、 總結

CountDownLatch 以極簡 API 解決「多線程同步起跑/同步結束」核心痛點。並發測試不再是「大概同時」,而是「精確納秒級同步」。掌握它,是從寫測試代碼到寫專業壓測工具的分水嶺。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved