semaphore通过许可计数控制并发访问,初始化时指定最大线程数(如new semaphore(5)),支持公平/非公平模式;acquire()和release()须成对且置于try-finally中;推荐使用tryacquire()设置超时,配合availablepermits()、getqueuelength()等方法监控状态。

Semaphore 是 Java 并发编程中控制资源并发访问最直接有效的工具之一,它不锁资源本身,而是通过“许可计数”在入口处做并发闸门,确保任意时刻最多只有指定数量的线程能进入临界区。
初始化时设定最大并发数
构造 Semaphore 时传入整数参数,即为系统允许同时访问资源的线程上限。这个值应与下游资源的实际承载能力匹配,比如数据库连接池大小、第三方接口 QPS 限制、硬件设备并发数等。
- 写法:new Semaphore(5) 表示最多 5 个线程可同时执行
- 可选公平模式:new Semaphore(5, true) 保证等待最久的线程优先获取许可,避免饥饿
- 非公平模式(默认)吞吐更高,适合对响应顺序无严格要求的场景
在业务逻辑入口处 acquire() 和 release()
必须成对使用,且推荐放在 try-finally 块中,防止因异常导致许可未释放,造成资源永久阻塞。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- semaphore.acquire():阻塞式获取许可,无可用许可时线程挂起
- semaphore.release():归还许可,唤醒等待队列中的线程
- 务必在 finally 中调用 release(),否则一旦抛异常,许可就“漏掉”了
应对超时与失败场景的健壮写法
生产环境不建议无限等待许可,应设置合理超时或降级策略。
- 限时获取:semaphore.tryAcquire(3, TimeUnit.SECONDS),3 秒内拿不到则返回 false
- 失败后可快速失败(返回错误)、排队重试或走异步补偿流程
- 避免用 acquireInterruptibly() 除非你明确处理中断逻辑,否则容易引发意外交互问题
监控与调试关键状态
运行时可通过几个方法观察信号量健康度,便于排查阻塞或资源瓶颈。
- availablePermits():当前空闲许可数,可用于日志打点或告警
- getQueueLength():估算等待线程数,持续大于 0 说明并发压力已超出配置
- hasQueuedThreads():布尔判断是否有线程在排队,适合轻量巡检
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










