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

【锁3】Semaphore(信号量)

Semaphore(信号量)的核心是用 N 张“许可证”限制同时访问资源的线程数——线程进来先 acquire() 拿一张,用完 release() 还回去;许可证发完了,后面的线程就得排队。下面给你 Java 最常用版本的可运行示例。

核心概念

初始化时指定许可证数量 N,相当于“最多允许 N 个线程同时进临界区”

acquire():拿许可证,没有就阻塞等待

release():还许可证,务必放在finally或使用with,否则忘了释放就会死锁

tryAcquire():非阻塞版本,拿不到立刻返回false,适合做限流降级

importjava.util.concurrent.Semaphore;publicclassSemaphoreDemo{// 许可证数量为 3,即同时最多 3 个线程能进临界区privatestaticfinalSemaphoresemaphore=newSemaphore(3);publicstaticvoidmain(String[]args){for(inti=1;i<=5;i++){newThread(newTask("线程-"+i)).start();}}staticclassTaskimplementsRunnable{privatefinalStringname;Task(Stringname){this.name=name;}@Overridepublicvoidrun(){try{semaphore.acquire();// 拿许可证,没有就阻塞System.out.println(name+" 进入临界区,当前可用许可证: "+semaphore.availablePermits());Thread.sleep(2000);// 模拟业务耗时System.out.println(name+" 执行完毕");}catch(InterruptedExceptione){e.printStackTrace();}finally{semaphore.release();// 一定要释放!System.out.println(name+" 释放许可证");}}}}

运行后会看到:前 3 个线程同时进入,后 2 个等前面有人释放后才依次进入。

线程-1 进入临界区,当前可用许可证:2线程-4 进入临界区,当前可用许可证:0线程-3 进入临界区,当前可用许可证:1线程-1 执行完毕 线程-4 执行完毕 线程-3 执行完毕 线程-4 释放许可证 线程-3 释放许可证 线程-1 释放许可证 线程-5 进入临界区,当前可用许可证:1线程-2 进入临界区,当前可用许可证:2线程-5 执行完毕 线程-5 释放许可证 线程-2 执行完毕 线程-2 释放许可证 进程已结束,退出代码为0

🎯 典型应用场景对比

场景许可证数量说明
数据库连接池连接数上限例如设置 10,防止连接耗尽
API 接口限流QPS 上限例如设置 50,保护后端服务
爬虫并发控制目标站承受力避免请求过快被封 IP
互斥锁(Mutex)*1等同于Lock,实现线程独占

⚠️ 注意事项

  1. 死锁风险:如果acquire()后未调用release()(如异常中断),会导致永久阻塞。
  2. 公平性:Java 构造器new Semaphore(3, true)可设置为公平模式(FIFO),但会降低性能。
  3. Asyncio 作用域asyncio.Semaphore必须在async def函数内创建,不能在模块顶层创建(会报 Event Loop 错误)。
http://www.jsqmd.com/news/1307347/

相关文章:

  • 树莓派双通道RS485 HAT设计:从SC16IS752芯片到工业数据采集实战
  • 新手部署 OpenClaw 避坑指南,路径设置与安全软件兼容要点(含安装包)
  • C++元编程异构词典:基于策略模式实现类型安全的累加器设计
  • 2026浦江县空调拆装公司推荐,家具拆装公司哪家好?4个坑+5条硬标准,帮你绕开90%的坑 - geo88
  • SolidWorks 21合1插件:3倍效率提升的机械设计整合方案
  • 【论文复现】AAAI 2026 AerialMind 中的 SACR 模块:航拍小目标增强,即插即用!附赠YOLO26改进
  • 树莓派5 PCIe接口驱动5G模组:打造高性能边缘计算网关实战
  • Jetson Xavier NX开发实战:从硬件解析到AI模型边缘部署
  • SpringBoot+Vue大学生迎新系统开发实践
  • 深圳商业隔音门窗工程|酒店民宿康养中心临街低频噪音解决方案 - 深圳市美多乐隔音门窗
  • C++动态规划精解:从01背包问题到空间优化与实战技巧
  • 终极Hyper-V设备直通指南:如何用图形化工具快速实现GPU直通
  • 3分钟掌握NewTab-Redirect:让Chrome新标签页完全自定义
  • 零代码私有化自动化AI算法训练服务器DLTM一站式训推平台技术解析
  • 2026金东区半日式搬家公司哪家好怎么选不踩坑?居民搬家避坑指南与正规公司推荐 - geo88
  • Unity高性能虚线渲染:从LineRenderer到片元着色器的完整方案
  • 基于Arduino的桌面级多功能噪音合成器:从白噪音到波形合成的DIY实践
  • 2026年 一键闪测仪源头厂家推荐榜:高精度定做实力品牌与口碑优选解析 - 优企名品
  • 郑州卖黄金避坑测评,综合保障首选推荐收的顶合规门店 - 奢侈品回收评测
  • FDC与RDC:现代供应链仓储网络的核心架构与协同优化
  • Raspberry Pi Debug Probe:从CMSIS-DAP原理到嵌入式调试实战
  • 支付宝消费券回收怎么做?消费券属性与变现流程解析~~ - 京顺回收
  • 树莓派LC29H GPS/RTK HAT实战:从单点定位到厘米级精度的完整指南
  • Assistants API将停止服务:Python迁移Responses API实战
  • 暗黑破坏神2存档编辑完全指南:如何用d2s-editor打造个性化游戏体验
  • C++并发编程实战:基于锁的线程安全数据结构设计与实现
  • 2026年 ISO9001认证机构推荐榜单:质量管理体系认证,ISO9001体系认证,ISO9001质量管理体系认证公司优选 - 优企名品
  • 2026年重度抑郁休学到高考夺魁心理咨询实战复盘 - 万相科技
  • AI语音播客制作全栈拆解(含Whisper+ElevenLabs+Descript深度调参手册)
  • HTML到DOCX转换技术深度解析:企业级文档自动化解决方案架构设计