当前位置: 首页 > news >正文

并发三剑客:CountDownLatch、Semaphore 与 CyclicBarrier 的奇妙旅行

背景设定

想象你正在组织一场大型旅游活动。这场旅行涉及多个环节——游客集合、上车出发、景点游览、集体拍照、返程下车……每个环节都需要多人协作、同步进行。而 Java 并发包里的这三个工具类,就像三位各司其职的“旅行协调员”,分别负责不同的任务节奏控制。


第一章:CountDownLatch —— “等所有人干完活再收工”的监工

🧑‍💼 角色定位:一次性任务汇总员

在旅行前,你需要先为每位游客计算专属优惠价格(比如根据会员等级打折)。这项工作由10个后台线程并行完成——每个线程负责一个游客的价格计算。

但你不能提前宣布“价格算好了”,必须等所有10个人都算完才行。

这时候,你就请来了CountDownLatch这位“一次性监工”。

🔧 工作方式:

  • 你一开始就说:“我要等10个人完成任务。” →new CountDownLatch(10)
  • 每个线程算完自己的部分,就喊一声:“我搞定了!” → 调用countDown()
  • 主线程站在门口等着,直到听到第10声“搞定” →await()返回,继续下一步
CountDownLatchlatch=newCountDownLatch(10);// 启动10个线程计算价格...latch.await();// 阻塞,直到所有线程调用 countDown()System.out.println("所有价格计算完毕,可以出票了!");

⚠️ 特点:

  • 只能用一次:一旦计数归零,就不能再重置。就像监工交差后就下班了。
  • 适合“多对一”同步:多个子任务完成后,通知主线程继续。

适用场景:初始化资源、并行任务汇总、测试等待所有线程就绪。


第二章:Semaphore —— “限流闸机”的守门人

🧑‍💼 角色定位:并发流量控制器

现在游客要进入景区了!但景区规定:同一时间最多只能有5人进入,否则会拥挤。

于是你请来Semaphore这位“守门人”,他手里拿着5张“入场券”(许可证)。

🔧 工作方式:

  • 初始发放5张券 →new Semaphore(5)
  • 游客想进?先领一张券 →acquire()
    • 如果还有券,立刻进入;
    • 如果没券了,就在门口排队等别人出来。
  • 游客离开时,把券还回去 →release(),下一个人就能进
Semaphoregate=newSemaphore(5);// 最多5人同时进入newThread(()->{gate.acquire();// 申请进入System.out.println("游客进入景区...");Thread.sleep(2000);gate.release();// 离开,归还许可}).start();

⚠️ 特点:

  • 可重复使用:券用完还能回收再发。
  • 支持公平/非公平模式:默认“谁抢到谁进”(非公平),也可改成“先到先得”(公平)。
  • 不限定具体线程:任何线程都能申请或释放许可。

适用场景:数据库连接池、API限流、限制同时在线用户数。


第三章:CyclicBarrier —— “全员到齐才出发”的导游

🧑‍💼 角色定位:循环协同触发器

现在到了最关键的环节:全团必须一起上车,一起下车

你有10位游客 + 1位导游,共11人。只有当所有人都坐上车,大巴才能启动;同样,所有人都下车后,才算行程结束。

这时,你请来了CyclicBarrier这位“循环导游”。

🔧 工作方式:

  • 设定人数:11人 →new CyclicBarrier(11)
  • 每个人上车后喊一声:“我上车了!” → 调用await()
  • 前10个人喊完,会被阻塞在车上等待;
  • 第11个人(比如导游)喊完,所有人同时被释放,车子启动!
  • 更神奇的是:下车时再用同一个 barrier,它还能再用一次
CyclicBarrierbarrier=newCyclicBarrier(11);// 每个游客线程:barrier.await();// 上车等待System.out.println("游客X上车");// 导游也 await()barrier.await();// 此刻全员释放,车开动!// 后续还能再次用于“下车同步”

⚠️ 特点:

  • 可循环使用:一次屏障解除后,自动重置,下次还能用。
  • 支持回调动作:可以在全员到齐时执行一个任务(比如发车前检查安全带)。
  • 所有参与者平等:没有“主线程 vs 子线程”之分,大家都是 await 的一员。

适用场景:多线程模拟、并行计算分阶段同步、游戏回合制同步。


第四章:三人对比 —— 谁该在什么时候出场?

工具谁在等?谁在动?能不能重用?典型比喻
CountDownLatch主线程等子线程子线程干完就走❌ 一次性监工验收工程
Semaphore线程等许可任意线程申请/释放✅ 可重用景区限流闸机
CyclicBarrier所有线程互相等全员协同行动✅ 可循环导游喊“人齐了没?”

🎯 使用建议:

  • 等一堆任务做完再继续?→ 选CountDownLatch
  • 限制同时干活的人数?→ 选Semaphore
  • 让一群人步调一致、分阶段行动?→ 选CyclicBarrier

尾声:并发世界的秩序之美

在看似混乱的多线程世界里,正是这些精巧的同步工具,让程序像一支训练有素的旅行团——

有人负责汇总进度,有人控制人流,有人确保全员同步。

它们不争不抢,各司其职,共同维护着并发世界的秩序与效率。

下次当你面对复杂的线程协作问题时,不妨问问自己:

“我现在需要的是监工、守门人,还是导游?”

答案,就在你的业务场景之中。


希望这个“旅行故事”让你对这三个并发工具的理解更生动、更牢固!

详细代码解读请看Semaphore&CountDownlatch&CyclicBarrier源码分析

http://www.jsqmd.com/news/368556/

相关文章:

  • 2026年评价高的光纤偏振控制器公司推荐:光纤拉伸器厂家推荐/光纤拉伸器哪家好/光纤拉伸器哪里有/选择指南 - 优质品牌商家
  • 大语言模型时代评估的范式转变
  • SemaphoreCountDownlatchCyclicBarrier源码分析
  • 【ESP32-S3】WINDOWS+VMware+ROS2+YDLIDA X2导航测试
  • 2026年山东洗涤设备厂家综合评估与精选推荐 - 2026年企业推荐榜
  • 2026年光纤放大器公司权威推荐:光纤拉伸器联系方式/光纤放大器价格/光纤放大器作用/光纤放大器公司推荐/选择指南 - 优质品牌商家
  • GLM-ASR-Nano-2512快速上手:curl命令直连API完成语音转写调用
  • 0.5秒的精准捕捉:AR眼镜如何用AI视觉重塑工业质检标准
  • Qwen3-VL-4B Pro部署教程:解决transformers版本兼容的内存补丁实践
  • LightOnOCR-2-1B与TensorRT加速:推理性能提升实战
  • 2026年厦门遗产纠纷律师厂家权威推荐榜:厦门劳动纠纷律师、厦门医疗纠纷律师、厦门工伤律师、厦门工伤认定律师选择指南 - 优质品牌商家
  • HY-Motion 1.0与VMware虚拟化环境的集成方案
  • FA_融合和滤波(FF)-无迹卡尔曼滤波(UKF)
  • 法律金融从业者必备:GLM-4-9B-Chat长文本分析工具
  • 【netty】EventLoop
  • GTE文本向量-中文-large效果展示:中文直播评论实时事件检测——突发话题/争议焦点/情绪拐点
  • 2026年平开窗铝材厂家盘点:五家实力企业解析 - 2026年企业推荐榜
  • AutoGen Studio与React集成:现代化前端开发实践
  • GLM-4.7-Flash参数详解:flash-attn2启用条件、量化选项与推理精度权衡
  • 基于STM32F103平台的示波器应用设计方案
  • 基于HY-Motion 1.0的智能家居控制动作生成
  • GTE文本嵌入模型在IDEA开发工具中的插件开发
  • 基于MATLAB的鲁棒性独立分量分析实现方案
  • 异地恋不慌!用Like_Girl搭专属恋爱纪念站,cpolar让浪漫跨干里
  • 2026年抗磨液压油工厂甄选指南:6家顶尖服务商深度解析 - 2026年企业推荐榜
  • 2026年预氧丝毡自动送料裁断机选哪家直销厂家推荐 - 品牌宣传支持者
  • 2026年评价高的三格式化粪池公司推荐:农村化粪池、农村厕所化粪池、定制化粪池、家用小化粪池、工业废水处理设备选择指南 - 优质品牌商家
  • 基于C#实现专业级打印模板
  • 2026年116外开窗纱一体系统窗厂家最新推荐:110双内开系统窗、116外开系统窗、126外开系统窗选择指南 - 优质品牌商家
  • 2026大模型智能体Agent爆发:实在智能引领“数字员工”从对话走向全自动执行