CountDownLatch 是 Java 并发包中用于线程同步的倒计数辅助类,初始化时指定计数值,调用 countDown() 减一,await() 阻塞等待归零,不可重置,适用于一次性等待场景。

CountDownLatch 是 Java 并发包(java.util.concurrent)中一个轻量级的同步辅助类,用于让一个或多个线程等待其他线程完成一组操作后再继续执行。它的核心是“倒计数”,初始值设为线程数量,每次调用 countDown() 减 1,当计数归零时,所有等待的线程被唤醒。
初始化 CountDownLatch 并设定等待数量
创建实例时需指定初始计数值,通常等于需要等待的子任务数或线程数:
- 比如启动 3 个异步任务,就设
new CountDownLatch(3) - 计数值不能动态修改,一旦归零就不可重置(如需重用,考虑
CyclicBarrier) - 构造后立即可用,无需额外启动或注册
子线程完成任务后调用 countDown()
每个子线程在自己逻辑结束前调用 countDown(),表示“我已完成”:
- 该方法是线程安全的,可被任意线程多次调用(但超出初始值无意义)
- 推荐放在
finally块中,避免因异常导致计数未减,造成主线程永久阻塞 - 示例:latch.countDown(); —— 简单、无返回值、不抛异常
主线程调用 await() 阻塞等待归零
主线程(或其他协调线程)在关键节点调用 await(),直到计数变为 0 或超时:
立即学习“Java免费学习笔记(深入)”;
-
latch.await():无限期等待,除非被中断(会抛InterruptedException) -
latch.await(5, TimeUnit.SECONDS):带超时,返回true表示成功归零,false表示超时 - 若等待期间被中断,当前线程的中断状态会被清除,需手动恢复(
Thread.currentThread().interrupt())
典型使用场景与注意事项
常见于“启动屏障”或“聚合结果”类需求,例如:
- 多个服务初始化完成后,才启动主流程
- 并行计算多个子任务,全部返回后再汇总结果
- 测试中模拟并发请求到达同一时间点
- 注意:CountDownLatch 是一次性工具;若需重复使用,请改用
CyclicBarrier或手动 new 新实例


















