← 每日面试题 学习看板

CountDownLatch、CyclicBarrier、Semaphore区别?

面试题/00java/02Java 并发编程/02JUC工具类/CountDownLatch、CyclicBarrier、Semaphore区别?.md

面试记录 2026-10-17

题目:CountDownLatch、CyclicBarrier、Semaphore 区别?

难度:low

标签:java/juc, general/knowledge

评分:⭐⭐⭐☆☆(3/5)

我的回答

三者是AQS中共享模式下的三个不同实现; countDownlatch是用于单个主线程下执行计数递减使用,每个对象只能用一次,所以要设置在主方法内使用,用过归零后就需要重新创建了,比如对资源的调用控制; cyclicbarrier是用于进行线程启动控制,用于等待多个线程到达后再执行下一步操作,可以用来进行结果组合,多线程调用不同下游,然后等待所有下游结果返回后,进行对结果统一组合; semaphore是信号量,控制一次可以通过的线程数,超过的会被阻塞,可以用来做限流,一次只允许一定个数的线程通过执行

点评

优点:三者用途都讲对了——CDL 计数归零、CB 线程到齐、Semaphore 控制通过数量;CDL/Semaphore 属于 AQS 共享模式也对。

不足:"三者都是 AQS 共享模式"错——CyclicBarrier 是 ReentrantLock + Condition 实现的,不走 AQS。也没点出"一次性 vs 可复用"这个核心对比。

补充:CDL 一次性、CB 可循环复用(有 reset/barrierAction);CDL 等的是"事件",CB 等的是"彼此",Semaphore 控制的是"并发许可数"。

完整讲解

第一部分:知识重点剖析

核心考点定位:三者的语义差异 + 底层实现方式。

知识点拆解:

  1. CountDownLatch:一次性的"等待计数归零"。AQS 共享模式,state = 计数;await() 阻塞、countDown() 减到 0 唤醒全部等待线程。
  2. CyclicBarrier:可循环的栅栏,N 个线程互相等待到齐再一起放行。ReentrantLock + Condition 实现(不是 AQS),可传 barrierAction、可 reset() 复用。
  3. Semaphore:许可信号量,acquire/release 控制同时通过的线程数。AQS 共享模式,state = 剩余许可。
  4. 一句话区分:CDL 等"事件"、一次性;CB 等"彼此"、可复用;Semaphore 控"数量"。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. CyclicBarrier 为什么能复用,CDL 为什么不能?
  1. Semaphore 能替代限流器吗?和令牌桶区别?
  1. AQS 共享模式如何唤醒多个线程?

第三部分:面试者参考回答(三步法口语化)

【一句话结论】

面试官您好,三者都是并发协调工具,但语义和实现都不同。

【三点展开】

第一,CountDownLatch 是一次性的"等待事件",主线程 await 等计数归零,底层是 AQS 共享模式;

第二,CyclicBarrier 是可循环的"互相等待到齐",底层是 ReentrantLock + Condition——注意它不走 AQS;

第三,Semaphore 是许可信号量,控制同时通过的线程数,底层是 AQS 共享模式,常用来限流。

【一句边界】

当然,CyclicBarrier 的 reset() 会打断已等待的线程抛 BrokenBarrierException,生产环境要慎用 reset。