首页 > 其他 > 详细

CountDownLatch源码分析

时间:2018-01-22 15:46:41      阅读:182      评论:0      收藏:0      [点我收藏+]

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源码分析

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!