基于AQS实现的简单的Semaphore

时间:2022-07-24
本文章向大家介绍基于AQS实现的简单的Semaphore,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
/**
 * @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;
                }
            }
        }


    }
}