CountDownLatch 是 Java 并发包中用于线程协调的同步工具,通过计数器控制等待逻辑:构造时设初值,countDown() 减1,await() 阻塞直至计数为0;不可重置,需防漏调用,支持超时,基于 AQS 实现。

CountDownLatch 是 Java 并发包(java.util.concurrent)中一个轻量级的同步工具类,用于让一个或多个线程等待其他线程完成一组操作后再继续执行。它内部维护一个计数器,每次调用 countDown() 方法就减 1,当计数器变为 0 时,所有因调用 await() 而阻塞的线程会被唤醒并继续运行。
CountDownLatch 的基本用法
创建时指定初始计数值,常用场景是“主线程等待多个子线程完成任务”。关键方法只有三个:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
CountDownLatch(int count):构造函数,设置倒计时初始值 -
await():当前线程阻塞,直到计数器为 0 或被中断 -
countDown():将计数器减 1,通常由工作线程在完成任务后调用
典型使用示例:主线程等待 3 个子线程执行完毕
假设需要并发执行 3 个耗时任务,主线程需等全部完成才打印汇总结果:
<font color="#888">CountDownLatch latch = new CountDownLatch(3);
// 启动 3 个子线程
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
// 模拟业务处理
Thread.sleep(1000);
System.out.println("任务完成:" + Thread.currentThread().getName());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
latch.countDown(); // 通知完成一个任务
}
}).start();
}
// 主线程等待所有子线程完成
try {
latch.await(); // 阻塞直到计数为 0
System.out.println("全部任务已完成,开始汇总...");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}</font>
注意事项和常见陷阱
-
计数器不可重置:CountDownLatch 是一次性使用的,计数归零后再次调用
await()会立即返回,无法重复利用;如需循环控制,请考虑CyclicBarrier -
避免漏调 countDown():某个线程异常退出未调用
countDown(),会导致主线程永久阻塞;建议放在finally块中确保执行 -
await 支持超时机制:可用
await(long timeout, TimeUnit unit)避免无限等待,返回false表示超时未完成 - 不涉及锁竞争:CountDownLatch 不依赖 synchronized 或 Lock,底层基于 AQS(AbstractQueuedSynchronizer),性能较好
适用场景总结
- 启动服务时,等待多个初始化模块加载完成
- 批量任务分发后,统一收集结果前的协调等待
- 性能测试中,让多线程同时开始执行(配合
CountDownLatch和volatile标志位) - 替代简单的 join(),但比 join() 更灵活(可跨线程、可设超时、可多个线程共同触发)


















