countdownlatch 是 java 中一次性、轻量高效的同步辅助类,通过原子递减计数器协调线程时序:构造时指定正整数 count,await() 阻塞等待计数归零,countdown() 原子减 1;计数为 0 后不可重置,后续 await 直接返回。

CountDownLatch 是 Java 并发编程中轻量、高效且一次性的同步辅助类,核心作用是让一个或多个线程等待,直到其他线程完成指定数量的操作。它不涉及锁竞争,也不要求线程持有资源,只靠一个原子递减的计数器协调执行时序。
CountDownLatch 的基本用法
使用只需三步:初始化、等待、递减。
- 构造时传入正整数 count,表示需等待的任务/线程数量;若传入 0,
await()立即返回,不阻塞 - 等待方(如主线程)调用
latch.await()—— 当前线程挂起,直到计数归零或被中断 - 工作方(如子线程)完成任务后调用
latch.countDown()—— 计数器原子减 1;若减至 0,所有 await 中的线程被唤醒
关键行为与限制
理解它的“一次性”特性,能避免典型误用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 计数器只能减少,不能重置或增加;一旦归零,后续所有
await()调用都直接返回,不再阻塞 - 不保证线程执行顺序,只保证“等待方看到所有工作方已调用过
countDown()” - 若某工作线程未调用
countDown()(比如异常退出、逻辑遗漏),等待线程将永久阻塞——务必在 finally 块中调用countDown() -
getCount()是非原子快照,仅适合调试或日志,不可用于同步判断
常用变体与实用技巧
应对真实场景中的不确定性,可借助超时和异常处理增强健壮性。
- 用
await(long timeout, TimeUnit unit)替代无参版本,避免无限等待;返回 false 表示超时,可做降级或告警 - 捕获
InterruptedException后建议恢复中断状态:Thread.currentThread().interrupt();,便于上层感知 - 多个逻辑阶段需等待?不要复用同一个 CountDownLatch;可组合多个实例,或改用
CyclicBarrier - 想实现“同时启动”效果(如并发压测)?用两个 CountDownLatch 配合:第一个控制就绪,第二个统一发令
底层靠 AQS 实现,但你不必深挖
CountDownLatch 内部基于 AbstractQueuedSynchronizer(AQS)的共享模式,state 字段即计数值。其高效性来自 CAS 原子操作与 FIFO 等待队列。不过日常使用无需关心这些——只要记住:它不是锁,不抢资源;它是门闩,只管倒数开门。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










