码迷,mamicode.com
首页 > 其他好文 > 详细

CountDownLatch源码分析

时间:2018-01-22 16:09:23      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:设置   and   turn   count   blog   bool   time   exception   释放   

CountDownLatch、Semaphore(信号量)和ReentrantReadWriteLock.ReadLock(读锁)都采用AbstractOwnableSynchronizer中共享排队的方式实现。

关于AbstractQueuedSynchronizer中的独占锁和共享锁,请参考ReentrantLock(http://www.cnblogs.com/bjorney/p/8040085.html)和ReentrantReadWriteLock(http://www.cnblogs.com/bjorney/p/8064268.html)

1. CountDownLatch

private static final class Sync extends AbstractQueuedSynchronizer {
    Sync(int count) {
        setState(count); // sync的锁状态(锁计数)state = count
    }

    protected int tryAcquireShared(int acquires) {
        return (getState() == 0) ? 1 : -1; // sync的锁状态(锁计数)state不为0则尝试取锁失败,进入SyncQueue排队等锁
    }

    protected boolean tryReleaseShared(int releases) {
        for (;;) {
            int c = getState();                 /*记录state*/
            if (c == 0)
                return false;
            int nextc = c - 1;
            if (compareAndSetState(c, nextc))   /*CAS设置state -= 1*/ 
                return nextc == 0; // sync的锁状态(锁计数)state为0则尝试释放锁成功,唤醒在SyncQueue排队等锁的所有节点(线程)
        }
    }
}

2. CountDownLatch.sync

public class CountDownLatch {
    private final Sync sync;

    public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count); // sync的锁状态(锁计数)state = count
    }

    public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);  // 参数1并未使用
    }

    public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
    }

    public void countDown() {
        sync.releaseShared(1); // sync的锁状态(锁计数)state--,见Sync.tryReleaseShared
    }

    ... ...

}

CountDownLatch源码分析

标签:设置   and   turn   count   blog   bool   time   exception   释放   

原文地址:https://www.cnblogs.com/bjorney/p/8329209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!