
一句话CountDownLatch等所有线程都干完活再放行Semaphore控制同时执行的线程数CompletableFuture让多个任务并行跑。它们都是面试中常见的并发工具前两个基于 AQS。CountDownLatch —— 等所有人都干完解决什么问题等 N 个任务都执行完成后再统一放行执行后续逻辑。使用场景系统启动时需要等 4 个初始化任务都完成才能接受请求。代码示例CountDownLatchlatchnewCountDownLatch(4);for(inti0;i4;i){newThread(()-{System.out.println(初始化中...Thread.currentThread().getName());latch.countDown();// 完成一个计数器 -1}).start();}// 主线程等着latch.await();// 阻塞直到计数器归零System.out.println(所有初始化完成系统就绪 ✅);AQS 视角CountDownLatch(4) state 4在 AQS 的 state 里 每个 countDown() → state -1CAS 修改 await() → state 0 就进 CLH 队列等着 state 0 → 唤醒 CLH 队列里所有线程 简单说state 到了 0统一放行。面试话术CountDownLatch 适合等所有事情都办完再继续的场景。 比如系统启动时等多个模块初始化完成或者批量处理任务时 等所有子任务结束再汇总结果。Semaphore —— 只有 N 个许可证解决什么问题限制同时访问某个资源的线程数量——信号量限流。使用场景调用 RCS 接口对方限制同一时间只能有 5 个请求。代码示例SemaphoresemaphorenewSemaphore(5);// 5 个许可证for(inti0;i10;i){newThread(()-{try{semaphore.acquire();// 拿许可证拿不到就排队等System.out.println(调 RCS 接口...Thread.currentThread().getName());Thread.sleep(1000);}catch(InterruptedExceptione){e.printStackTrace();}finally{semaphore.release();// 还许可证}}).start();}结果 5 个任务先拿到许可证 → 执行 另外 5 个排队等着 前面的 release 后 → 后面依次拿到许可证 同时执行的不会超过 5 个AQS 视角Semaphore(5) state 5可用许可证数量 acquire() → state -1CASstate0 时 → 进 CLH 队列等 release() → state 1CAS唤醒 CLH 队列里等的人面试话术Semaphore 适合控制并发数的场景比如调用第三方接口对方有限流。 acquire 拿许可证release 归还同一时间最多 N 个请求出去。 在项目里我们的多产线叫料如果需要对 RCS 接口做限流 Semaphore 就很合适。CompletableFuture —— 异步编排解决什么问题多个互不依赖的任务并行执行全部完成后统一处理结果。注意CompletableFuture 不是分布式框架 它是单 JVM 内的异步编程工具基于 ForkJoinPool 实现。场景串行 vs 并行// 串行慢UseruseruserApi.getUser(id);// 0.5sListOrderordersorderApi.getOrders(id);// 0.5sIntegerpointspointApi.getPoints(id);// 0.5s// 总耗时1.5s// 并行快CompletableFutureUserf1CompletableFuture.supplyAsync(()-userApi.getUser(id));CompletableFutureListOrderf2CompletableFuture.supplyAsync(()-orderApi.getOrders(id));CompletableFutureIntegerf3CompletableFuture.supplyAsync(()-pointApi.getPoints(id));// 等所有都完成CompletableFuture.allOf(f1,f2,f3).join();Useruserf1.get();ListOrderordersf2.get();Integerpointsf3.get();// 总耗时0.5s最慢的那个还能编排依赖关系// 先查用户 → 再用用户信息查订单 → 最后处理CompletableFuture.supplyAsync(()-userApi.getUser(id)).thenApply(user-orderApi.getOrders(user.getId())).thenAccept(orders-System.out.println(订单数orders.size()));面试话术CompletableFuture 适合多个互不依赖的接口调用并行化。 比如门户首页同时查待办、通知、天气全部回来再统一渲染页面 减少串行等待时间提升首屏加载速度。它不是分布式框架 是单 JVM 内的异步编排工具。对比总结工具基于 AQS一句话说清楚你项目里的场景CountDownLatch✅等 N 件事都干完再放行系统启动等全部模块初始化完Semaphore✅只有 N 个许可证控制并发数RCS 接口限流CompletableFuture❌基于 ForkJoinPool并行执行多个任务统一处理结果门户首页多数据源并行加载参考来源JDK8 JUC 源码《Java 并发编程的艺术》