public class CountDownLatch 复制代码
//同步器,是AbstractQueuedSynchronizer的子类 private final Sync sync; 复制代码
从字段属性可以看出
public CountDownLatch(int count) { //参数检查 if (count < 0) throw new IllegalArgumentException("count < 0"); //初始化Sync this.sync = new Sync(count); } 复制代码
从构造方法中可以看出
//等待,直到count到0再执行,或者线程被中断 public void await() throws InterruptedException { //调用sync的acquireSharedInterruptibly方法进入等待 sync.acquireSharedInterruptibly(1); } //设置超时时间的等待 public boolean await(long timeout, TimeUnit unit) throws InterruptedException { //调用sync的tryAcquireSharedNanos方法进入等待 return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); } 复制代码
//count 减1 public void countDown() { //调用sync的releaseShared方法 sync.releaseShared(1); } 复制代码
//获取count public long getCount() { //调用sync的getCount return sync.getCount(); } 复制代码
public String toString() { //可以看出打印了count的值 return super.toString() + "[Count = " + sync.getCount() + "]"; } 复制代码
从方法中可以看出Sync对象是一个共享锁
private static final class Sync extends AbstractQueuedSynchronizer 复制代码
从类的定义中可以看出
//序列化版本号 private static final long serialVersionUID = 4982264981922014374L; 复制代码
//传入count Sync(int count) { //调用父类的setState方法 setState(count); } 复制代码
从构造方法可以看出
//获取count,实际上就是获取state int getCount() { return getState(); } 复制代码
//尝试获取共享锁,重写父类方法,这个方法是让父类调用 protected int tryAcquireShared(int acquires) { //如果state为0,返回1, 其他的返回-1 //小于0会尝试获取锁,如果获取锁失败则会进入队列等待被唤醒 return (getState() == 0) ? 1 : -1; } 复制代码
//释放共享锁,这个参数没有意义,每次通过CAS自旋的方法让state-1 protected boolean tryReleaseShared(int releases) { //无限for循环表示自旋 for (;;) { //获取状态值 int c = getState(); //如果状态值为0, 表示已经完全释放锁了,直接返回false if (c == 0) return false; //状态值不为0,让状态值-1,并用CAS设置新值 int nextc = c-1; if (compareAndSetState(c, nextc)) return nextc == 0; } } 复制代码