Semaphore

作者: Pillar_Zhong | 来源:发表于2019-06-05 21:58 被阅读0次
    Semaphore.png

    Constructor

    // 所谓的信号量就是sync的permits,也就是state
    public Semaphore(int permits) {
        sync = new NonfairSync(permits);
    }
    
    // 并且信号量分公平和非公平模式
    public Semaphore(int permits, boolean fair) {
        sync = fair ? new FairSync(permits) : new NonfairSync(permits);
    }
    

    tryAcquireShared

    FairSync

    protected int tryAcquireShared(int acquires) {
        for (;;) {
            // 基于公平原则看有没有到自己
            if (hasQueuedPredecessors())
                return -1;       
            int available = getState();
            // 计算当前所剩的信号量
            int remaining = available - acquires;
            // 如果所剩的信号量不足,那么直接返回还剩多少
            // 如果还有多余的信号量,且成功更新,那么返回最新的信号量
            // 否则信号量还有剩余,但是更新state失败,那么有必要进入自旋模式,进行重试。
            if (remaining < 0 ||
                compareAndSetState(available, remaining))
                return remaining;
        }
    }
    

    NonfairSync

    final int nonfairTryAcquireShared(int acquires) {
        for (;;) {
            // 跟公平模式的唯一不同是,这里不需要看下一个是否是按顺序来的,其他都一样
            int available = getState();
            int remaining = available - acquires;
            if (remaining < 0 ||
                compareAndSetState(available, remaining))
                return remaining;
        }
    }
    

    tryReleaseShared

    protected final boolean tryReleaseShared(int releases) {
        for (;;) {
            int current = getState();
            // 归还信号量,所以state需要加总回来
            int next = current + releases;
            if (next < current) // overflow
                throw new Error("Maximum permit count exceeded");
            // CAS成功
            if (compareAndSetState(current, next))
                return true;
        }
    }
    

    相关文章

      网友评论

          本文标题:Semaphore

          本文链接:https://www.haomeiwen.com/subject/qevsxctx.html