AQS源码浅析(8)——Semaphore

2022-04-27  本文已影响0人  墨_0b54
public Semaphore(int permits) {//permits是许可数量,默认非公平模式
    sync = new NonfairSync(permits);
}
public Semaphore(int permits, boolean fair) {//fair为true时是公平模式
    sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
semaphore.acquire(5);// 获取5个许可
test(threadnum);
semaphore.release(5);// 释放5个许可
abstract static class Sync extends AbstractQueuedSynchronizer {
    private static final long serialVersionUID = 1192457210091910933L;
    Sync(int permits) {
        setState(permits);
    }
    final int getPermits() {
        return getState();
    }
    final int nonfairTryAcquireShared(int acquires) {
        for (;;) {
            int available = getState();
            int remaining = available - acquires;
            if (remaining < 0 || //有足够的许可
                compareAndSetState(available, remaining))
                return remaining;
        }
    }
    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))
                return true;
        }
    }
    final void reducePermits(int reductions) {//减少许可
        for (;;) {
            int current = getState();
            int next = current - reductions;
            if (next > current) // underflow
                throw new Error("Permit count underflow");
            if (compareAndSetState(current, next))
                return;
        }
    }
    final int drainPermits() {//获取并返回立即可用的所有许可个数,并且将可用许可置0
        for (;;) {
            int current = getState();
            if (current == 0 || compareAndSetState(current, 0))
                return current;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读