Java 并发编程(十三) — CountDownLatch源码分析

public class CountDownLatch
复制代码

2. 字段属性

//同步器,是AbstractQueuedSynchronizer的子类
private final Sync sync;
复制代码

从字段属性可以看出

  • CountDownLatch的核心是内部类Sync,可以猜测出所有的操作都是通过Sync对象来操作的

3. 构造方法

public CountDownLatch(int count) {
    	//参数检查
        if (count < 0) throw new IllegalArgumentException("count < 0");
    	//初始化Sync
        this.sync = new Sync(count);
    }
复制代码

从构造方法中可以看出

  • 构造方法只做了一件事就是初始化Sync对象

4. 方法

await 方法

//等待,直到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));
    }
复制代码

countDown 方法

//count 减1
public void countDown() {
    	//调用sync的releaseShared方法
        sync.releaseShared(1);
    }
复制代码

getCount 方法

//获取count
public long getCount() {
    	//调用sync的getCount
        return sync.getCount();
    }
复制代码

toString 方法

public String toString() {
    	//可以看出打印了count的值
        return super.toString() + "[Count = " + sync.getCount() + "]";
    }
复制代码

从方法中可以看出Sync对象是一个共享

5. 内部类Sync

1. 类的定义

private static final class Sync extends AbstractQueuedSynchronizer
复制代码

从类的定义中可以看出

  • Sync是CountDownLatch私有的静态内部类
  • Sync继承了AbstractQueuedSynchronizer

2. 字段属性

//序列化版本号
private static final long serialVersionUID = 4982264981922014374L;
复制代码

3. 构造方法

//传入count
Sync(int count) {
    		//调用父类的setState方法
            setState(count);
        }
复制代码

从构造方法可以看出

  • 传入的count就是AbstractQueuedSynchronizer的state方法

4. 方法

getCount 方法

//获取count,实际上就是获取state
int getCount() {
            return getState();
        }
复制代码

tryAcquireShared 方法

//尝试获取共享锁,重写父类方法,这个方法是让父类调用
protected int tryAcquireShared(int acquires) {
    		//如果state为0,返回1, 其他的返回-1
    		//小于0会尝试获取锁,如果获取锁失败则会进入队列等待被唤醒
            return (getState() == 0) ? 1 : -1;
        }
复制代码

tryReleaseShared 方法

//释放共享锁,这个参数没有意义,每次通过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;
            }
        }
复制代码

原文 

https://juejin.im/post/5e6edc76f265da573e673ffb

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java 并发编程(十三) — CountDownLatch源码分析

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址