首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于AQS实现的简单的Semaphore

基于AQS实现的简单的Semaphore

作者头像
张申傲
发布2020-09-03 15:34:08
发布2020-09-03 15:34:08
3750
举报
文章被收录于专栏:漫漫架构路漫漫架构路
代码语言:javascript
复制
/**
 * @Auther: ZhangShenao
 * @Date: 2019/3/3 11:15
 * @Description:自定义Semaphore,内部通过Sync同步器继承了AQS,采用共享的方式获取资源
 */
public class SimpleSemaphore {
    private Sync sync;

    public SimpleSemaphore(int permits){
        sync = new Sync(permits);
    }


    public void acquire(){
        sync.acquireShared(1);
    }

    public void release(){
        sync.releaseShared(1);
    }

    static class Sync extends AbstractQueuedSynchronizer {
        public Sync(int permits) {
            if (permits <= 0) {
                throw new IllegalArgumentException("Permits must be positive!!");
            }
            setState(permits);
        }

        @Override
        protected int tryAcquireShared(int reduce) {
            for (; ; ) {
                int current = getState();
                int remains = current - reduce;
                if (remains < 0 || compareAndSetState(current, remains)) {
                    return remains;
                }
            }
        }

        @Override
        protected boolean tryReleaseShared(int released) {
            for (; ; ) {
                int current = getState();
                int updated = current + released;
                if (updated < current){
                    throw new RuntimeException("Maximum permit count exceeded!!");
                }
                if (compareAndSetState(current, updated)) {
                    return true;
                }
            }
        }


    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档