JUC之Semaphore源码的示例分析
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要为大家展示了"JUC之Semaphore源码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"JUC之Semaphore源码的示例分析"
千家信息网最后更新 2025年11月07日JUC之Semaphore源码的示例分析
这篇文章主要为大家展示了"JUC之Semaphore源码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"JUC之Semaphore源码的示例分析"这篇文章吧。
Semaphore 主要用于限量控制并发执行代码的工具类, 其内部通过 一个 permit 来进行定义并发执行的数量。
/** * 使用非公平版本构件 Semaphore */public KSemaphore(int permits){ sync = new NonfairSync(permits);}/** * 指定版本构件 Semaphore */public KSemaphore(int permits, boolean fair){ sync = fair ? new FairSync(permits) : new NonfairSync(permits);}/** AQS 的子类主要定义获取释放 lock */abstract static class Sync extends KAbstractQueuedSynchronizer{ private static final long serialVersionUID = 1192457210091910933L; /** * 指定 permit 初始化 Semaphore */ Sync(int permits){ setState(permits); } /** * 返回剩余 permit */ final int getPermits(){ return getState(); } /** * 获取 permit */ final int nonfairTryAcquireShared(int acquires){ for(;;){ int available = getState(); int remaining = available - acquires; // 判断获取 acquires 的剩余 permit 数目 if(remaining < 0 || compareAndSetState(available, remaining)){ // cas改变 state return remaining; } } } /** * 释放 lock */ protected final boolean tryReleaseShared(int releases){ for(;;){ int current = getState(); int next = current + releases; if(next < current){ // overflow throw new Error(" Maximum permit count exceeded"); } if(compareAndSetState(current, next)){ // cas改变 state return true; } } } final void reducePermits(int reductions){ // 减少 permits for(;;){ int current = getState(); int next = current - reductions; if(next > current){ // underflow throw new Error(" Permit count underflow "); } if(compareAndSetState(current, next)){ return; } } } /** 将 permit 置为 0 */ final int drainPermits(){ for(;;){ int current = getState(); if(current == 0 || compareAndSetState(current, 0)){ return current; } } }}/** * 调用 acquireSharedInterruptibly 响应中断的方式获取 permit */public void acquire() throws InterruptedException{ sync.acquireSharedInterruptibly(1);}/** * 调用 acquireUninterruptibly 非响应中断的方式获取 permit */public void acquireUninterruptibly(){ sync.acquireShared(1);}/** * 尝试获取 permit */public boolean tryAcquire(){ return sync.nonfairTryAcquireShared(1) >= 0;}/** * 尝试的获取 permit, 支持超时与中断 */public boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException{ return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));}/** * 支持中断的获取permit */public void acquire(int permits) throws InterruptedException{ if(permits < 0){ throw new IllegalArgumentException(); } sync.acquireSharedInterruptibly(permits);}/** * 不响应中断的获取 permit */public void acquireUninterruptibly(int permits){ if(permits < 0) throw new IllegalArgumentException(); sync.acquireShared(permits);}/** * 尝试获取 permit */public boolean tryAcquire(int permits){ if(permits < 0) throw new IllegalArgumentException(); return sync.nonfairTryAcquireShared(permits) >= 0;}/** * 尝试 支持超时机制, 支持中断 的获取 permit */public boolean tryAcquire(int permits, long timout, TimeUnit unit) throws InterruptedException{ if(permits < 0) throw new IllegalArgumentException(); return sync.tryAcquireSharedNanos(permits, unit.toNanos(timout));}/** * 释放 permit */public void release(){ sync.releaseShared(1);}/** * 释放 permit */public void release(int permits){ if(permits < 0) throw new IllegalArgumentException(); sync.releaseShared(permits);}/** * 返回可用的 permit */public int availablePermits(){ return sync.getPermits();}/** * 消耗光 permit */public int drainPermits(){ return sync.drainPermits();}/** * 减少 reduction 个permit */protected void reducePermits(int reduction){ if(reduction < 0) throw new IllegalArgumentException(); sync.reducePermits(reduction);}/** * 判断是否是公平版本 */public boolean isFair(){ return sync instanceof FairSync;}/** * 返回 AQS 中 Sync Queue 里面的等待线程 */public final boolean hasQueuedThreads(){ return sync.hasQueuedThreads();}/** * 返回 AQS 中 Sync Queue 里面的等待线程长度 */public final int getQueueLength(){ return sync.getQueueLength();}/** * 返回 AQS 中 Sync Queue 里面的等待线程 */protected Collection getQueueThreads(){ return sync.getQueuedThreads();} 以上是"JUC之Semaphore源码的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
尝试
支持
源码
示例
分析
内容
版本
篇文章
线程
方式
构件
剩余
学习
帮助
代码
子类
工具
数目
数量
易懂
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
机房服务器上面是什么
软件开发应届毕业生招聘
spss建立数据库文件的格式
轻量应用服务器部署后端
吉林省服务器托管虚拟主机
网络安全法末成年
梦幻西游山东百花园服务器怎么进
远程管理服务器异地怎么办
学校管理软件开发公司
sql数据库代码编辑
青岛市软件开发费用人工时
美萍进销存数据库
bcv 技术数据库
dgx-1服务器算力
电脑网络安全模式可以用吗
互联网创新科技
广西华为数字服务器
id网络安全管理系统默认密码
嵌入式软件开发要加班吗
群晖和服务器哪个好
四川在线网络安全
龙之谷登录服务器连接不上
低功耗蓝牙软件开发
服务器的智能监控管理结束
网络安全工作检查工作总结
关系数据库模型的主要特征
高性价比的欧洲服务器
网络技术题T接线器
php中连接数据库时用那个语句
2017年最新网络安全法