讲师中心 微信公众号
AI工具推荐 视频效率加速

并发控制的“门票”思想:分析 Semaphore 如何通过许可证控制对象的创建速率变量

阿婷同学_3129

阿婷同学_3129

发布时间:2026-05-09 13:07:06

|

934人浏览过

|

来源于php中文网

原创

Semaphore通过许可证控制对象创建的并发数而非总数,需在创建前acquire、成功后release,并用try-finally防泄露;initialCount和maximumCount决定节流强度,公平性影响排队顺序但不改变平均速率,应配合超时和中断避免死等。

并发控制的“门票”思想:分析 semaphore 如何通过许可证控制对象的创建速率变量

Semaphore 的“门票”思想,本质是用许可证(permit)作为访问资源的准入凭证。它不直接控制对象创建本身,而是通过限制**同时能执行创建逻辑的线程数量**,间接调控对象生成的速率。关键点在于:许可证管的是“并发执行权”,不是“对象总数”或“创建动作是否发生”。

许可证如何绑定到对象创建流程

要让 Semaphore 控制对象创建速率,需将 acquire() 和 release() 显式嵌入创建逻辑中:

  • 在 new 对象或调用工厂方法前,先调用 semaphore.acquire() —— 没有门票,线程就停在这儿等
  • 对象成功创建(且完成必要初始化)后,再调用 semaphore.release() —— 归还门票,腾出名额给下一个线程
  • 若创建过程可能失败(如构造异常),必须用 try-finally 或 try-with-resources 确保 release() 总被执行,否则许可证泄露,后续线程永久阻塞

初始值与最大值决定“节流强度”

构造 Semaphore 时传入的两个参数直接影响速率控制效果:

  • initialCount:初始可用许可证数,即系统启动时允许多少线程立刻开始创建对象(例如设为 0,表示所有创建请求都需等待主线程统一放行)
  • maximumCount:许可证上限,也是同一时刻最多有几个线程能并行执行创建逻辑;设为 5,就相当于“最多 5 张并发门票”,哪怕有 100 个线程排队,也只准 5 个同时开工
  • 注意:initialCount 不能超过 maximumCount,也不能为负;maximumCount 必须 ≥ 1

公平性影响排队秩序,但不改变平均速率

是否启用公平模式(fair = true)决定了线程获取许可证的顺序:

  • 公平模式下,先到的线程先得票,适合对响应时间敏感、要求可预测延迟的场景
  • 非公平模式(默认)允许插队,吞吐量略高,但个别线程可能长时间等待
  • 无论哪种,单位时间内释放的许可证总数不变,因此长期平均创建速率由 release() 调用频率和 maximumCount 共同约束

配合超时与中断,避免死等

生产环境不应让线程无限期等待许可证:

  • 用 tryAcquire(long timeout, TimeUnit unit) 替代 acquire(),设置合理超时(如 3 秒),超时未拿到票就放弃创建,防止雪崩
  • 捕获 InterruptedException 并正确处理(如清理资源、记录日志),确保线程可被外部中断,提升系统可控性
  • 不建议在创建逻辑里忽略中断信号,否则会破坏 JVM 的协作中断机制

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

510

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

323

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

513

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

263

2025.11.27

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

PixPix官网入口合集
PixPix官网入口合集

本专题汇总了PixPix官网在线使用入口及平台功能详解,涵盖文生图、图生图、AI图片编辑、AI视频创作等核心能力,并整理了AI爆款图片复刻、商品套图、详情页生成、视频变清晰与去水印等电商专项工具的使用教程。同时收录了PixPix MCP接入Codex、Claude Code等主流Agent的操作指南,助您一站式完成AI图片与视频创作。

0

2026.10.09

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

60

2026.10.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

160

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

140

2026.09.30

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn