CountDownLatch是Java并发包中用于线程协调的同步辅助类,通过倒计时机制让一个或多个线程等待其他线程完成操作后再继续执行;它基于AQS实现,计数器只减不增、不可重置,适用于多任务等待、并发压测等场景。

CountDownLatch 是什么
CountDownLatch 是 Java 并发包(java.util.concurrent)中一个轻量、一次性的同步辅助类,核心作用是让**一个或多个线程等待其他线程完成操作后再继续执行**。它像一道“倒计时门闩”:初始设一个整数(比如 3),每有线程完成任务就调用 countDown() 减 1;等待的线程调用 await() 进入阻塞,直到计数归零,门闩打开,全部唤醒。
关键行为与限制
理解它的行为边界,才能避免误用:
- 计数器只减不增,初始化后不可重置——用完即弃,不能重复使用
- await() 可被中断,抛出 InterruptedException,需合理处理
- countDown() 是线程安全的,多个线程并发调用不会导致计数错乱
- 计数为 0 后,再调用 countDown() 无效果;后续调用 await() 会立即返回,不阻塞
- 底层基于 AQS(AbstractQueuedSynchronizer)共享模式,state 字段即计数值
典型实战场景
它不解决数据竞争,而是协调执行时机。常见用法包括:
- 主线程等待多任务完成:如启动 5 个下载线程,主线程用 await() 等待全部结束,再合并文件
- 模拟高并发压测:多个线程调用 await() 集体阻塞,主线程统一调用 countDown() 触发“秒杀开始”,实现精准并发起点
- 服务初始化协同:Spring 启动时,多个组件异步加载(配置、缓存、连接池),主流程通过 CountDownLatch 确保全部就绪后再开放接口
基础用法示例
以下代码展示三线程并行执行任务,主线程等待全部完成:
立即学习“Java免费学习笔记(深入)”;
// 初始化计数器为 3
CountDownLatch latch = new CountDownLatch(3);
// 启动三个子线程,各自执行后减一
for (int i = 0; i
new Thread(() -> {
System.out.println("任务开始");
try { Thread.sleep(1000); } catch (InterruptedException e) { }
System.out.println("任务完成");
latch.countDown();
}).start();
}
// 主线程阻塞等待
System.out.println("等待所有任务……");
latch.await();
System.out.println("全部完成,继续执行");


















