首页 > 学院 > 开发设计 > 正文

源码分析-CountDownLatch

2019-11-08 20:05:30
字体:
来源:转载
供稿:网友

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 zero for (;;) { 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(); }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表