countdownlatch核心用于同步多个线程的启动时机,实现统一信号下的并发起跑;它是一次性计数器,适用于压测、分布式初始化、前置条件等待等场景,语义聚焦“何时一起开始”而非“何时全部结束”。

CountDownLatch 主要用于协调多个线程的启动时机,确保一批任务在统一信号下同时开始执行,而不是各自随意启动。它的核心价值不在“等待完成”,而在“同步起跑”——这是和 CyclicBarrier、CompletableFuture 等机制的关键区别。
统一触发批量任务启动
常见于压测准备、分布式节点协同初始化、多线程模拟并发请求等场景。主线程调用 countDown() 前,所有工作线程都阻塞在 await() 上;一旦倒计时归零,全部线程立刻释放并开始执行。
- 例如:启动 100 个线程模拟用户登录,要求它们在同一毫秒级时刻发起请求,此时每个线程先 await(),主线程初始化完毕后统一 countDown()
- 注意:CountDownLatch 是一次性用品,不可重置;若需重复使用,应考虑 CyclicBarrier
等待前置条件就绪后再并发执行
适用于多个依赖项(如配置加载、连接池建立、缓存预热)必须全部完成,后续任务才能并行展开的场景。各前置任务在线程中执行完毕后调用 countDown(),主流程通过 await() 确保等待全部就绪。
- 例如:微服务启动时,数据库连接、Redis 客户端、配置中心监听器分别由不同线程初始化,主线程用 CountDownLatch 等待三者全部 ready 后,再启动定时任务和 HTTP 服务
- 与 join() 不同,它不关心线程是否结束,只关注“某个状态是否达成”;与 volatile + while 循环相比,更轻量且避免忙等
配合线程池实现可控的并发节奏
在固定大小线程池中,用 CountDownLatch 控制“每批 N 个任务同步启动”,适合需要分批次施加压力或隔离资源竞争的场景。
- 例如:向消息队列发送 1000 条数据,每 10 条为一组,组内并发发送但组间串行;每组创建独立的 CountDownLatch(10),提交任务前共享该 latch,任务体里先 await() 再发消息
- 避免因线程池复用导致不同批次任务混在一起执行,增强可观察性和调试性
CountDownLatch 的设计简洁,语义明确,用对了能显著提升并发逻辑的清晰度和可靠性。关键在于厘清它解决的是“何时一起开始”,而不是“何时全部结束”。











