Java并发编程中CountDownLatch的await用法详解:掌握多线程同步核心技巧!CountDownLatch是Java并发包中实现"多等一"场景的利器,通过await()方法实现线程阻塞等待,countDown()进行计数减一。本文深度解析await()的基础用法、超时控制、重置陷阱等核心知识点,并提供典型面试场景解决方案,包括微服务调用同步、高并发压测模拟等实战案例。同时揭示线程池搭配、计数器泄露等常见坑点,帮助开发者正确使用这一重要并发工具。附赠2025最新Java面试宝典资源,助你轻松应对多线程相关面试难题!
2025年Java面试宝典网盘地址:
🔗 点我获取
提取码:9b3g
CountDownLatch是Java并发包里的一个同步工具类,直译过来叫"倒计时门闩"。它特别适合控制多个线程等待某个共同任务完成的场景。核心思想是:初始化一个计数器,线程调用await()
阻塞等待,其他线程完成任务后调用countDown()
减少计数,当计数器归零时,所有等待线程被唤醒继续执行。
面试中被问到CountDownLatch的await用法时,一定要抓住它的"多等一"特性——多个线程等待一组操作完成。
// 初始化计数器(假设需要等待3个任务)
CountDownLatch latch = new CountDownLatch(3);
// 等待线程调用await()
latch.await(); // 阻塞直到计数器为0
// 工作线程完成任务后减计数
latch.countDown();
实际生产环境一定要设置超时时间,避免死等:
boolean success = latch.await(5, TimeUnit.SECONDS);
if(!success) {
// 处理超时逻辑(例如日志告警、中断任务等)
}
CountDownLatch不能重置!计数器归零后再次调用await()
会立即返回。如果需要重复使用,考虑换成CyclicBarrier
。
"假设你有5个微服务调用,必须全部返回结果才能组装响应,怎么实现?"
答:
用CountDownLatch初始化计数器为5,主线程调用await()
阻塞。每个服务线程获取数据后执行countDown()
。当计数器归零时,主线程开始组装数据。
"如何模拟1千个用户同时发起请求?"
答:
创建CountDownLatch(1000),所有请求线程先调用await()
阻塞。主线程调用countDown(1000)
瞬间释放所有线程,实现真正并发。
countDown()
都被执行(用finally块!)executor.execute(()->{
task.run();
latch.countDown(); // 必须放在任务内!
});
await()
会释放锁,但synchronized
不会!🛎️ 特别提示:
准备Java面试过程中,如果需要购买面试鸭会员,通过 面试鸭返利网 找我可返利25元!真实优惠,亲测有效 👇
Q:await()
和countDown()
的调用线程必须相同吗?
A:不需要!这是跨线程通信的工具
Q:能在ForkJoinPool中使用吗?
A:谨慎使用!工作窃取机制可能导致countDown()
调用次数异常
Q:和CyclicBarrier的核心区别?
A:CountDownLatch是事件驱动(任务完成触发),CyclicBarrier是线程同步(线程就绪触发)
掌握这些await用法细节,面试官就知道你真正在项目中用过并发工具了!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包