本文主要是介绍源码分析-CountDownLatch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CountDownLatch
基本用法
CountDownLatch会接受一个初始化的int值count,通过调用await方法阻塞当前线程。通过其他线程调用countDown来降低当前状态值,当当前状态将至0 时,所有阻塞在CountDownLatch的线程都会立刻从await返回。
CountDownLatch时一次性的,不可以重置,如果需要重置请使用CyclicBarrier。
实现
实现比较简单。就是abstractQueuedSynchronizer基础上的实现。
首先在CountDownLatch内有一个Sync的内部静态子类,继承自AQS。
这里主要是重写了tryAcquireShared和tryReleaseShared两个共享锁。以及一个带参数的构造器构造器用来初始化count数字。
在
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) {//当当前状态为0是可以获得一个共享锁。return (getState() == 0) ? 1 : -1;}protected boolean tryReleaseShared(int releases) {//只要当前线程不是0则循环尝试cas降低state直至成功为止。// Decrement count; signal when transition to zerofor (;;) {int c = getState();if (c == 0)return false;int nextc = c-1;if (compareAndSetState(c, nextc))return nextc == 0;}}}
每个CountDownLatch包含一个Sync实例。使用组合的形式,将公用方法委托给这个Sync实例实现。
public CountDownLatch(int count) {if (count < 0) throw new IllegalArgumentException("count < 0");this.sync = new Sync(count);}public void await() throws InterruptedException {sync.acquireSharedInterruptibly(1);}public boolean await(long timeout, TimeUnit unit)throws InterruptedException {return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));}public void countDown() {sync.releaseShared(1);}public long getCount() {return sync.getCount();}
这篇关于源码分析-CountDownLatch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!