countdownlatch 是基于递减计数器的线程同步工具,用于等待多个线程完成操作后继续执行;初始化指定计数,countdown() 递减,await() 阻塞直至归零或超时,适用于一次性事件协调。

CountDownLatch 是 Java 并发包中用于线程间流程控制的同步工具,核心作用是让一个或多个线程等待其他线程完成一组操作后再继续执行,本质是“计数器驱动的阻塞等待”。
CountDownLatch 的基本原理和初始化
它内部维护一个整型计数器(count),构造时指定初始值。每次调用 countDown() 方法,计数器减 1;调用 await() 的线程会阻塞,直到计数器变为 0 或被中断。
- 计数器只能递减,不能重置或增加
- 一旦计数器归零,所有等待线程被唤醒,后续再调用 await() 将立即返回
- 适合一次性事件协调(如启动屏障、结束汇总),不适用于循环场景(此时应考虑 CyclicBarrier)
典型使用模式:主线程等待多个子任务完成
这是最常见流程控制场景——比如启动服务前需加载配置、缓存、数据库连接等,可并行执行后统一检查就绪状态。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 创建 CountDownLatch,count 设为子任务数量(如 new CountDownLatch(3))
- 主线程启动所有子线程,并在最后调用 await() 阻塞
- 每个子线程完成工作后调用 countDown(),无需关心调用顺序或是否重复
- 当第 3 次 countDown() 执行后,计数器归零,await() 返回,主线程继续执行后续逻辑
带超时的流程控制与异常处理
生产环境必须避免无限等待,推荐使用带超时的 await(long timeout, TimeUnit unit)。
- 若超时前未完成,await() 返回 false,主线程可做降级处理(如记录告警、跳过非关键步骤)
- 子线程中发生异常时,仍应调用 countDown(),否则可能导致主线程永久阻塞
- 建议在子线程 try-finally 块中调用 countDown(),确保无论成功失败都释放计数
与其他同步工具的协作边界
CountDownLatch 关注“完成信号”,不负责共享数据保护或线程互斥。
- 需要共享变量更新时,配合 volatile 或 Atomic 类保证可见性
- 涉及临界区操作(如汇总结果到集合),仍需 synchronized 或 ReentrantLock
- 不要把它当作线程安全容器使用,它的职责非常单一:倒计时 + 通知等待者
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










