countdownlatch 是 java 并发包中用于线程协同等待的同步工具,内部维护不可重置的计数器,调用 countdown() 减一,await() 阻塞直至归零或超时,适用于主线程等待多任务完成等场景。

CountDownLatch 是 Java 并发包(java.util.concurrent)中用于线程间协同等待的同步工具,核心作用是:让一个或多个线程等待,直到其他线程完成一组操作后才继续执行。
理解 CountDownLatch 的基本机制
它内部维护一个计数器(int count),初始化时指定初始值。每次调用 countDown() 方法,计数器减 1;当计数器变为 0 时,所有因调用 await() 而阻塞的线程会被唤醒并继续执行。注意:计数器不可重置,一旦归零,后续调用 await() 将立即返回。
典型使用场景:主线程等待多个子任务完成
比如启动 3 个异步任务处理数据,主线程需等全部完成后再汇总结果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建 CountDownLatch,传入任务数量(如 new CountDownLatch(3))
- 每个子线程执行完自己的逻辑后调用 latch.countDown()
- 主线程在关键位置调用 latch.await(),阻塞直到计数归零
带超时的等待更健壮
避免因某个线程异常未调用 countDown() 导致永久阻塞,推荐使用带超时的 await:
- latch.await(10, TimeUnit.SECONDS) —— 最多等 10 秒
- 返回 true 表示计数已归零;false 表示超时,此时可做失败处理(如日志、抛异常、清理资源)
注意事项和常见误区
CountDownLatch 不是锁,不控制临界区访问;它只负责“等待信号”。常见错误包括:
- 忘记在每个子线程中调用 countDown(),导致 await 永远不返回
- 在同一个线程里多次调用 countDown(),可能提前触发唤醒(除非设计如此)
- 误以为 await() 可中断 —— 实际上它可以响应中断,但需捕获 InterruptedException 并处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










