cyclicbarrier 和 countdownlatch 的区别
大家好,我是程序员老王。今天咱们聊聊面试常客——CyclicBarrier和CountDownLatch的区别。这俩兄弟都属于Java并发包里的同步工具,但设计理念和使用场景大不相同,面试时很容易被问到。

👉2025年Java面试宝典最新版:
🔹 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
🔹 提取码: 9b3g
(涵盖高频考点,帮你精准突破CyclicBarrier和CountDownLatch等并发难点!)
一、核心功能差异:等待的“角色”不同
- CountDownLatch: 像个单向倒计时门闩。主线程设定一个初始值(比如N),其他线程调用
countDown()减1。主线程调用await()会阻塞,直到计数器归零才放行。重点:主等子。 - CyclicBarrier: 更像循环使用的集合点。设定一个目标值(比如N),所有线程都调用
await()后才会同时继续执行。重点:子等子,互相等。
二、使用场景对比
-
CountDownLatch适用场景:
主线程需要等所有子任务完成再汇总。比如:- 启动服务时,等所有模块初始化完毕再开放端口
- 批量处理数据,主线程等所有Worker线程处理完才统计结果
-
CyclicBarrier适用场景:
多个线程需要相互等待到同一阶段再继续。比如:- 多线程分阶段计算(如MapReduce的map阶段等所有map完成才reduce)
- 模拟多人游戏,等所有玩家准备就绪才开始下一回合
三、重用性:决定能否“复活”
- CountDownLatch: 一次性用品!计数器到0就失效了,不能重置。想再用?new一个新的吧。
- CyclicBarrier: 可循环使用!当所有线程到达屏障后,计数器自动重置为初始值,还能指定一个
Runnable在所有线程冲破屏障后执行(适合阶段性收尾)。
四、异常处理:谁扛得住“幺蛾子”
- CountDownLatch: 如果某个线程调用
countDown()前挂了,主线程可能永远await()下去... 需要外部机制保证计数一定能减完。 - CyclicBarrier: 如果一个线程在
await()时中断/超时/异常,屏障会被破坏,所有等待的线程会收到BrokenBarrierException。这时需要reset()重置屏障或处理异常。
五、谁更适合复杂任务协作?
CyclicBarrier 天然支持分阶段协作。比如一个任务分A、B、C三步,所有线程完成A后,在屏障处集合,然后自动重置,一起开始B阶段,再集合,再开始C。CountDownLatch要实现类似效果,得用多个实例,管理更麻烦。
面试官追问怎么答?
面试官:“你项目中用过哪个?为什么选它?”
答思路:
- 明确需求: 是主线程等子任务(CountDownLatch)还是线程间互相等阶段同步(CyclicBarrier)?
- 考虑生命周期: 需要重复同步吗?需要自动重置计数器吗?
- 容错要求: 能否容忍线程异常导致永久阻塞?是否需要自动通知其他线程屏障失效?
写在最后
理解CyclicBarrier和CountDownLatch的区别,关键在于抓住 “谁等谁” 和 “能否复用” 这两点。CountDownLatch是主控线程等待子任务完成,CyclicBarrier是子线程间互相等待到同步点。前者用完即废,后者可循环冲锋。

想系统准备Java并发面试? 我整理了最新的《2025 Java面试冲刺宝典》,包含CyclicBarrier、CountDownLatch、线程池、锁机制等高频考点解析和实战技巧,点击上方网盘链接即可获取!
对了,如果你需要购买面试鸭会员提升竞争力,记得通过 面试鸭返利网 找我下单,返利25元,实实在在省一笔! 用好工具,事半功倍!


