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释放成功唤醒队列等待线程无则无操作

相关新闻

最新新闻

蓝速科技横竖屏会议预约屏场景化选型与实测指南

蓝速科技横竖屏会议预约屏场景化选型与实测指南

在推进智慧办公弱电项目时,很多项目负责人容易陷入一个误区:为了采购方便或统一管理,往往不分场景地统一选用横屏或竖屏的会议室电子门牌。以蓝速科技的智慧会议预约屏方案为例,其核心设计理念正是反对这种“一刀切”。结果往往是…

2026/7/9 2:31:13
手机电脑电视多端看文件,选什么工具更顺手?

手机电脑电视多端看文件,选什么工具更顺手?

告别U盘来回拷,几套方案帮你搞定多设备文件访问前言作为一个手上同时有手机、电脑、电视/投影仪的设备党,你可能也遇到过这些情况:想在电视上看刚下好的电影,得先插U盘拷一遍手机拍了照片想发到电脑上编辑,微信发过去画…

2026/7/9 2:31:12
CSDN文章_AI_Agent开发避坑指南

CSDN文章_AI_Agent开发避坑指南

AI Agent开发避坑指南:从单智能体到多智能体协同的工程实践 一、AI Agent架构演进:从Rule-based到LLM-based 过去3年,我参与了12个AI Agent项目的落地,踩过无数坑,也积累了一些实战经验。今天把这些经验整理出来&#…

2026/7/9 2:31:12
通达信最佳买卖点指标

通达信最佳买卖点指标

AA05:MA(C,5),COLOR0099CC;五日乖离率:(C-AA05)/AA05*100; BB05:ATAN((AA05/REF(AA05,1)-1)*100)*180/3.1416; 速度5:SMA(EMA((AA05-REF(AA05,1))/REF(AA05,1),3)*100,3,1); 加速度5:EMA((速度5-REF(速度5,1)),3),LINETHICK0; STICKLINE(BB05>30 AND AA05>REF(AA05,1), A…

2026/7/9 2:31:12
AI智能体如何变革材料发现:从预测到全流程自动化

AI智能体如何变革材料发现:从预测到全流程自动化

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这类AI智能体最值得关注的不是它能预测多少种材料,而是它把传统材料发现中“文献调研-理论预测-实验验证”这个漫长流程&a…

2026/7/9 2:31:12
树莓派 5B Bookworm nmcli 创建 WiFi 热点踩坑全解:参数冲突导致 WiFi 无法连接

树莓派 5B Bookworm nmcli 创建 WiFi 热点踩坑全解:参数冲突导致 WiFi 无法连接

树莓派 5B Bookworm nmcli 创建 WiFi 热点踩坑全解:参数冲突导致 WiFi 无法连接 前言 使用树莓派 5B 官方 Bookworm 系统,通过nmcli命令行创建 WiFi AP 热点时,我踩了一个典型大坑:执行自定义创建命令后,手机能搜到热…

2026/7/9 2:26:12

月新闻