JUC之Semaphore源码的示例分析
发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,这篇文章主要为大家展示了"JUC之Semaphore源码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"JUC之Semaphore源码的示例分析"
千家信息网最后更新 2025年01月24日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 CollectiongetQueueThreads(){ return sync.getQueuedThreads();}
以上是"JUC之Semaphore源码的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
尝试
支持
源码
示例
分析
内容
版本
篇文章
线程
方式
构件
剩余
学习
帮助
代码
子类
工具
数目
数量
易懂
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
某某区网络安全宣传周方案
免费下载服务器
基岩版mc如何创建免费服务器
网络安全 golang
如东有名的网络技术创新服务
我的世界服务器大型抽奖机金币
卓茵科技互联网
阿里云服务器托管备案
关于军队网络安全ppt课件
电脑服务器配置标识
真旅网计算机软件开发上海
国外bim软件开发公司
网络安全基本常识简短
东软集团软件开发待遇怎么样
网络技术优秀员工
2021年国家网络安全周作品
湘潭市第三人民医院网络安全
有没有我的世界起床战争服务器
嘉兴晶安软件开发有限公司
数据库恢复 检查点
用友服务器数据库转移
漯河网络安全审查
网易服务器大螺丝
盐城软件开发代理商
构建税务系统网络安全
最新tbc服务器人数统计
数据库有效规则输入0至100
微信数据库修复时间长
美信网络技术网上支付
软件开发模板excel