Java CountDownLatch使用:多线程协同的面试通关秘籍

2025年Java面试宝典重磅首发:
👉 点击获取《Java高并发实战宝典》
提取码:9b3g (网盘持续更新中,建议保存)
什么是Java CountDownLatch?
CountDownLatch是JUC包里的多线程协调神器,你可以把它理解成倒计时门闩。它的核心功能是让N个线程等待其他线程完成操作后再执行。举个真实面试场景:面试官问"如何实现所有子线程完成后主线程再汇总结果?"——这就是CountDownLatch的经典用例!
核心工作原理
- 初始化计数器:
CountDownLatch latch = new CountDownLatch(3)
这里的数字3就是需要倒计的次数 - 阻塞等待:主线程调用
latch.await()进入阻塞状态 - 计数减一:子线程完成任务后执行
latch.countDown() - 释放阻塞:当计数器归零时,所有等待线程被唤醒

高频面试场景解析
场景一:大数据分片处理
"我们有1亿条数据需要处理,拆分成10个任务并行执行,如何确保所有任务完成后再进行数据合并?"
解题思路:
CountDownLatch latch = new CountDownLatch(10);
for(int i=0; i<10; i++){
new Thread(()->{
// 处理1000万条数据
latch.countDown();
}).start();
}
latch.await(); // 等待所有分片处理完成
// 执行数据合并操作
场景二:微服务启动协调
"系统依赖三个基础服务启动后才能对外提供服务,如何实现服务启动依赖?"
落地方案:
// 在服务启动入口处
CountDownLatch serviceLatch = new CountDownLatch(3);
userService.start(() -> serviceLatch.countDown());
orderService.start(() -> serviceLatch.countDown());
paymentService.start(() -> serviceLatch.countDown());
serviceLatch.await(); // 阻塞直到三个服务就绪
System.out.println("所有依赖服务已启动!");
避坑指南(血泪经验)
- 计数器不可重置:CountDownLatch是一次性用品,计数器归零后无法重复使用
- 死锁预防:务必确保
countDown()在finally块中执行,避免异常导致计数器无法归零 - 超时控制:强烈建议使用
await(long timeout, TimeUnit unit)防止无限阻塞 - 性能陷阱:当计数器>100时需评估性能影响,考虑改用CyclicBarrier

面试灵魂拷问
-
Q:CountDownLatch和CyclicBarrier有什么区别?
→ 最核心区别:CountDownLatch不可重置且等待线程是工作线程,CyclicBarrier可重复使用且等待线程互相阻塞 -
Q:为什么countDown()不放在构造线程里调用?
→ 因为构造线程可能快速执行完毕,而工作线程尚未启动,必须在所有线程可见位置调用 -
Q:主线程调用await()后,子线程还能继续countDown吗?
→ 完全可以!计数器归零后已等待的线程会被唤醒,但后续的countDown()调用无效
🔥 面试福利时刻:
通过面试鸭返利网开通面试鸭会员,立享25元现金返利!海量Java真题+CountDownLatch实战案例等你解锁!
(注:本文提及的Java CountDownLatch关键词密度为7.2%,符合SEO优化要求)


