Semaphore权限获取机制深度解析:控制并发力度

秋静大大_7843

秋静大大_7843

2026-06-13

244人浏览

原创

semaphore 的权限获取机制本质是“许可计数 + 阻塞等待”的组合,通过原子减法(acquire)和加法(release)操作 state 计数器控制并发数,支持公平/非公平模式、超时获取及误释放防护。

semaphore权限获取机制深度解析:控制并发力度

Semaphore 的权限获取机制本质是“许可计数 + 阻塞等待”的组合,它不锁住代码,而是控制能进入临界区的线程数量。关键不在“谁先拿到”,而在“当前还剩几个名额”。

许可数量决定并发上限

构造时传入的 permits 值就是系统允许的最大并发数,也是内部计数器的初始值。这个数一旦设定,就定义了资源池的容量边界:

  • 设为 1 → 效果等同互斥锁(但语义不同,不强调所有权)
  • 设为 5 → 最多 5 个线程可同时执行受保护逻辑
  • 设为 0 → 所有 acquire() 调用立即阻塞,适合做“启动门控”

acquire() 是减法操作,不是排队登记

每次调用 acquire(),底层 AQS 尝试对 state(即剩余许可数)执行原子减 1。成功则继续执行;失败(state 变为负数)才真正进入同步队列等待:

Komo Search
Komo Search

一款AI工具,主要用于Komo Search 是一个生成式AI驱动的搜索引擎,适合需要提升相关任务效率的用户。

下载
  • 非公平模式:新线程和唤醒线程一起竞争,可能“插队”
  • 公平模式:严格按 FIFO 排队,先到先得,避免饥饿但吞吐略低
  • acquire(3) 表示一次性扣减 3 个许可,要求当前可用数 ≥ 3,否则整体阻塞

release() 是加法唤醒,不校验调用者身份

release() 只做一件事:给 state 加 1,并检查是否有等待线程。若有,唤醒一个(公平模式唤醒队首,非公平模式可能唤醒任意一个):

  • 不要求释放者必须是获取者——任何线程都能 release,适合异步场景(如回调释放)
  • release(2) 表示归还 2 个许可,state 增加 2,可能唤醒多个等待线程(取决于队列长度与许可增量)
  • 误调用 release 多次会导致许可数溢出,超出初始值,可能引发逻辑失控(需业务层防护)

超时与尝试获取提供柔性控制

硬阻塞(acquire())在高 SLA 场景中风险较高,推荐搭配以下方式提升健壮性:

  • tryAcquire():非阻塞,返回 true/false,适合快速失败策略
  • tryAcquire(2, 1, TimeUnit.SECONDS):最多等 1 秒,期间若获得 2 个许可则返回 true,否则 false
  • 结合 availablePermits() 可做预检,但注意该值瞬时有效,不能替代 acquire 的原子性

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

9817

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

6942

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6132

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1064

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

888

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1296

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2569

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19911

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1155

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 180人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习