CountDownLatch是什么
大家好!今天咱们聊聊面试中经常被问到的并发工具——CountDownLatch。如果你正在准备Java面试,或者实际项目中需要协调多线程任务,这篇内容一定能帮到你!
什么是CountDownLatch的核心概念?
简单说,CountDownLatch是Java并发包里的一个"倒计时门闩"。它允许一个或多个线程等待其他线程完成操作后再继续执行。你可以把它想象成运动会的起跑线:所有运动员(线程)准备好后,裁判(主线程)才发令开跑!
核心就两点:
- 初始化计数器:比如
new CountDownLatch(3)表示需要倒计时3次。 - 等待与通知:
- 调用
await()的线程会阻塞等待 - 其他线程完成任务后调用
countDown()减1 - 计数器归零时,等待线程被唤醒
- 调用

手把手准备的2025年Java面试宝典 👇
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
CountDownLatch实际用在哪?
面试时被问到"说说CountDownLatch应用场景",你可以举这些例子:
场景1:多任务初始化
比如系统启动时需要加载缓存、连接数据库、初始化配置三个模块。主线程用CountDownLatch等待所有模块就绪:
CountDownLatch latch = new CountDownLatch(3);
// 线程1初始化缓存 → latch.countDown()
// 线程2连接DB → latch.countDown()
// 线程3加载配置 → latch.countDown()
latch.await(); // 阻塞直到三个任务完成
System.out.println("系统启动完毕!");
场景2:并行计算汇总
统计10个文件的行数,主线程汇总结果:
List<Future> results = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(10);
for (File file : files) {
executor.submit(() -> {
int lines = countFileLines(file);
results.add(lines);
latch.countDown(); // 每个文件统计完减1
});
}
latch.await(); // 等10个文件全处理完
int totalLines = results.sum();
关键点:
- CountDownLatch的计数器不可重置(CyclicBarrier可以复用)
- 调用
countDown()的线程不会被阻塞

面试中怎么答CountDownLatch问题?
被问到"CountDownLatch和CyclicBarrier区别?"时,记住这个表:
| 特性 | CountDownLatch | CyclicBarrier |
|--------------------|------------------------|------------------------|
| 重置计数器 | ❌ 不可重置 | ✅ 可循环使用 |
| 阻塞线程 | 调用await()的线程 | 所有线程互相等待 |
| 应用场景 | 主等子、子等子 | 多线程分阶段同步 |
举个实际例子🌰:
公司团建约车:
- CountDownLatch:司机等10个员工全上车(主线程等子线程)
- CyclicBarrier:10个员工互相等,都到停车场才一起出发(线程间互等)
最后的小福利
如果你正在刷Java面试题,强烈推荐用面试鸭的题库系统。悄悄说👉 通过面试鸭返利网(mianshiyafanli.com)购买会员可返25元,用我的链接能省一杯奶茶钱!

希望这篇帮你搞懂CountDownLatch!遇到并发协同问题,记得还有这个利器~ 需要面试资料再提醒下👇
📁 2025 Java面试宝典
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g


