JUC之Semaphore源码的示例分析
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要为大家展示了"JUC之Semaphore源码的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"JUC之Semaphore源码的示例分析"
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
百单网互联网科技有限公司
伟宏互联网科技
江苏根荣互联网科技
科技互联网龙头
深圳互联网络科技有限公司
互联网科技公司怎么样
百单互联网科技有限公司
互联网科技创新企业排名
互联网之后的科技是什么
央行互联网金融科技公司
常德市电业局互联网科技部
互联网科技项目计划书材料类
福建科技产业互联网发展
互联网还是高科技吗
黑科技闪耀互联网之光
中科明德北京互联网科技
互联网公司高科技产品
广州互联网高科技取餐柜
北京互联网科技类企业分布
现代科技的标志之一的互联网
科技金融是不是互联网金融
科技股互联网
厦门中拓互联网络科技有限公司
互联网科技战争
多迪互联网科技有限公司
湖南一路畅行互联网科技
哈尔滨屹滨互联网科技有限公司
深圳市罗太互联网科技有限公司
济南有互联网科技公司吗
江苏互联网科技小贷