Semaphore 源码 成员变量privatefinalSyncsync;构造方法// 默认非公平指定许可数量publicSemaphore(intpermits){syncnewNonfairSync(permits);}// 指定许可公平/非公平模式publicSemaphore(intpermits,booleanfair){syncfair?newFairSync(permits):newNonfairSync(permits);}acquire// 获取1个许可可中断许可不足则阻塞publicvoidacquire()throwsInterruptedException{sync.acquireSharedInterruptibly(1);}acquireSharedInterruptiblypublicfinalvoidacquireSharedInterruptibly(intarg)throwsInterruptedException{// 线程中断直接抛异常if(Thread.interrupted())thrownewInterruptedException();// 调用子类Sync实现的tryAcquireSharedif(tryAcquireShared(arg)0)// 获取失败进入共享阻塞队列挂起线程与 CountdonwLatch 一致doAcquireSharedInterruptibly(arg);}tryAcquireShared返回 ≥0拿到许可方法直接返回不阻塞返回 0无许可执行doAcquireSharedInterruptibly阻塞线inttryAcquireShared(intacquires){returnnonfairTryAcquireShared(acquires);}finalintnonfairTryAcquireShared(intacquires){for(;;){intavailablegetState();intremainingavailable-acquires;// 剩余许可0返回负数阻塞否则CAS修改state返回剩余值if(remaining0||compareAndSetState(available,remaining))returnremaining;}}releasepublicvoidrelease(){sync.releaseShared(1);}releaseSharedpublicfinalbooleanreleaseShared(intarg){// 调用Sync实现的tryReleaseShared更新state许可数if(tryReleaseShared(arg)){// 释放成功唤醒阻塞队列里等待许可的线程与 CountdownLatch 一致doReleaseShared();returntrue;}returnfalse;}tryReleaseSharedprotectedfinalbooleantryReleaseShared(intreleases){for(;;){intcurrentgetState();intnextcurrentreleases;// 安全校验防止无限release导致int溢出if(nextcurrent)thrownewError(Maximum permit count exceeded);if(compareAndSetState(current,next))returntrue;}}总结new Semaphore(3) → NonfairSync 构造 → setState (3)acquire() → sync.acquireSharedInterruptibly (1) → nonfairTryAcquireShared (1)返回 state - 1 ≥ 0则获取成功不阻塞否则挂起线程等待唤醒release() → sync.releaseShared (1) → tryReleaseShared (1)state 1释放成功唤醒队列等待线程无则无操作

相关新闻

最新新闻

绝地潜兵2高难度攻关指南:从警报管理到小队配置的实战框架

绝地潜兵2高难度攻关指南:从警报管理到小队配置的实战框架

绝地潜兵2 的 N8-N10 难度,是很多新手从“会开枪”到“会打任务”的分水岭。到了这几个档位,敌人的巡逻密度、援军响应速度和精英单位出现频率都会明显提升,再用低难度里“沿路清怪、见怪就打”的思路推进,往往会出现整支队伍被一…

2026/9/5 23:20:42
PHP互助理财系统源码解析:三级分销与资金流技术实现

PHP互助理财系统源码解析:三级分销与资金流技术实现

简介:这是一套基于PHP开发的互助理财系统源码,面向Web开发者与中小型项目创业者,适用于快速搭建具备资金互助、多级分润能力的金融类轻应用。资源包含完整的前后端代码与5套可切换UI风格,支持三级分红机制与红利返点逻辑&#xff…

2026/9/5 23:20:42
燃气灶选购指南:从能效等级到热效率,拆解省钱真相与安全要点

燃气灶选购指南:从能效等级到热效率,拆解省钱真相与安全要点

家里人在选燃气灶的时候,经常会看到类似“樱花卫厨 JZT-JGA12 燃气灶,新一级能效,一年省 214.58 元”这样的推荐语。第一眼看去很有吸引力:能效高、省钱、看起来很靠谱。但问题在于,“省 214.58 元”这个数字到底是怎么…

2026/9/5 23:20:42
Ghidra BSim 教程(一):启动 Ghidra 并启用 BSimSearchPlugin 插件

Ghidra BSim 教程(一):启动 Ghidra 并启用 BSimSearchPlugin 插件

Ghidra BSim 教程(一):启动 Ghidra 并启用 BSimSearchPlugin 插件 【免费下载链接】ghidra Ghidra is a software reverse engineering (SRE) framework 项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra 本文是 Ghidra BSim…

2026/9/5 23:20:42
基于协同过滤的Python音乐推荐系统实现与工程落地

基于协同过滤的Python音乐推荐系统实现与工程落地

很多做 Python 毕业设计的同学,看到“推荐系统”四个字,第一反应是先去找算法公式,第二反应是担心“数学不好能不能做”。实际上,毕设里的推荐系统并没有那么神秘。它最核心的协同过滤思想,翻译成大白话就是一句话&…

2026/9/5 23:20:42
基于Verilog的LeNet-5硬件加速器设计:从CNN算法到FPGA流水线实现

基于Verilog的LeNet-5硬件加速器设计:从CNN算法到FPGA流水线实现

简介:本资源是一个面向FPGA开发初学者与数字电路课程设计者的轻量级CNN硬件加速器实践项目,聚焦LeNet-5经典模型的Verilog全流程实现,解决深度学习推理在嵌入式端部署时的计算效率与资源约束难题。压缩包共44个文件(19个参数存储.…

2026/9/5 23:15:42