CountDownLatch

来源:互联网 发布:淘宝天猫订单无法评价 编辑:程序博客网 时间:2024/06/17 15:25

http://ifeve.com/talk-concurrency-countdownlatch/

实现原理

CountDownLatch内部实现了一个AQS的实例Sync,CountDownLatch的初始化容量为state状态值,调用countdown时,会转而调用sync.releaseShared(1),state状态减一,而调用await()时,则转而调用sync.acquireSharedInterruptibly(1),Sync的tryAcquireShared()实现如下所示。由代码可知,只有state状态为0时,才会获取锁成功。

private static final class Sync extends AbstractQueuedSynchronizer {    private static final long serialVersionUID = 4982264981922014374L;    Sync(int count) {        setState(count);    }    int getCount() {        return getState();    }    protected int tryAcquireShared(int acquires) {        return (getState() == 0) ? 1 : -1;    }    protected boolean tryReleaseShared(int releases) {        // Decrement count; signal when transition to zero        for (;;) {            int c = getState();            if (c == 0)                return false;            int nextc = c-1;            if (compareAndSetState(c, nextc))                return nextc == 0;        }    }}
0 0