Semaphore是J*a并发包中控制并发线程数量的许可计数器,基于AQS实现,通过acquire/release操作state字段管理许可,支持公平与非公平模式,常用于限制资源访问并发数。

Semaphore 是 J*a 并发包(j*a.util.concurrent)中用于**控制并发线程数量**的核心工具类,本质是一个“许可计数器”。它不解决互斥(像 synchronized 或 ReentrantLock 那样只让一个线程进),而是允许最多 N 个线程同时进入临界区——N 就是初始化时设定的许可数(permits)。
它背后靠的是 AQS(AbstractQueuedSynchronizer),用 state 字段存当前可用许可数:
acquire():尝试将 state 减 1;若减成功,线程继续;若减后为负(即没许可了),线程入 AQS 等待队列挂起release():将 state 加 1,并唤醒等待队列中一个线程(非公平模式)或队首线程(公平模式)acquire(2) 表示一次要 2 个许可构造时可选是否公平:
new Semaphore(3) → 默认非公平:新线程可能插队抢到刚释放的许可,吞吐略高,但老线程可能饿死new Semaphore(3, true) → 公平模式:严格 FIFO,先到先得,避免饥饿,但上下文切换多一点比如限制最多 3 个线程同时访问某慢速资源(如外部 HTTP 接口、数据库连接、文件读写):
星火作家大神
星火作家大神是一款面向作家的AI写作工具
140
查看详情
private static final Semaphore semaphore = new Semaphore(3);
Runnable task = () -> {
try {
semaphore.acquire(); // 拿不到许可就阻塞
System.out.println(Thread.currentThread().getName() + " 开始执行");
Thread.sleep(1500); // 模拟耗时操作
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaphore.release(); // 必须释放,否则许可永远少一个
System.out.println(Thread.currentThread().getName() + " 已释放");
}
};
// 启动 6 个线程
for (int i = 0; i < 6; i++) {
new Thread(task, "T-" + i).start();
}
运行结果会看到:任意时刻最多只有 3 行“开始执行”,其余线程在 acquire() 处等待,等有线程 release() 后才陆续跟进。
release() 放在 finally 块里,防止异常导致许可泄露tryAcquire() 可实现非阻塞限流,适合对响应时间敏感的场景*ailablePermits() 能查剩余许可数,适合做监控或动态降级reducePermits(1) 减少,release() 实际是增加(但通常不建议随意增,易引发逻辑混乱)基本上就这些。它不复杂,但容易忽略释放和公平性选择的影响。
以上就是J*a并发包里的Semaphore是什么_Semaphore核心机制与控制并发示例解析的详细内容,更多请关注其它相关文章!
# java
# 工具
# 深圳网站页面优化排名
# 是怎么
# 放在
# 是一个
# 的是
# 如何实现
# 慢速
# 它不
# 包里
# 最多
# 大神
# red
# ai
# 宁德网站推广优化
# 营销推广员个人简历
# 宁夏短视频运营推广营销
# 汕头网站怎样推广产品
# 工作室网站建设800元
# 平顶山官网seo关键词排名
# 文山网络营销推广公司
# 网站产品优化不错易速达
# seo资源搜刮器
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
支付宝网页版在线入口 支付宝官网电脑登录入口
微信步数怎么刷_微信步数快速提升技巧
《图怪兽》退出登录方法
AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案
吃完饭就犯困是什么原因 餐后嗜睡如何缓解
基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口
抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口
《海贝音乐》均衡器设置方法
猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法
如何在CSS中设置背景图像:一个全面指南
小米civi如何设置锁屏时间
《七读免费小说》开通会员方法
Pydantic 中“schema”字段命名冲突的解决方案
《鹿路通》退余额方法
金牛福袋获取攻略
《领英》查看屏蔽名单方法
太平年在哪个平台播出
哔哩哔哩在线观看入口 B站官网免费进入
Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】
《雷电模拟器》自动点击设置方法
Composer reinstall命令重装损坏的包
《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐
在VS Code中利用AI辅助进行代码迁移
Go反射进阶:访问内嵌结构体中的被遮蔽方法
cad怎么隐藏指定的图层_cad隐藏或冻结图层方法
天堂漫画网页版在线阅读 天堂漫画手机版入口
如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?
热血江湖归来医师加点攻略
yy漫画官方网站登录入口_yy漫画在线阅读页面地址
电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】
vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读
蜻蜓FM如何设置移动流量播放
《饿了么》拼好饭点外卖教程2025
《王者荣耀世界》英雄获取攻略
byrutor直接访问入口 byrutor官方游戏库
企查查官网和爱企查 企查查企业查询官网入口
《健康大兴》注册方法介绍
人教版电子教材在线获取指南
React应用中Commerce.js数据加载与状态管理最佳实践
J*a中导出MySQL表为SQL脚本的两种方法
《随手记》备份数据方法
优化Leaflet弹出层图片显示:条件渲染策略
WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程
sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧
如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
《原神》月之一版本新增书籍一览
192.168.1.1路由器后台入口 192.168.1.1默认登录入口
2025-12-13
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。