CountDownLatch源码走读

并发工具类中,我们简单了解了CountDownLatch,接下来走读下代码看看其是如何实现的,代码基于JDK1.7。

代码走读

当你打开CountDownLatch类后,你会发现这个类很简单的,其实就是基于AQS实现的共享锁。然后重写了tryAcquireShared()、tryReleaseShared()方法。AQS中定义了个模板方法,获取锁和释放锁的流程都一样,这里不再赘述,具体大家请参考AQS源码走读

CountDownLatch其实就是对于计数器进行加减操作

  1. CountDownLatch调用await()方法获取共享锁,当计数器为0是获取到锁,计数器初始的值通过构造方法传入。

  2. CountDownLatch调用countDown()方法释放共享锁,计数器减1。

总结:CountDownLatch基于AQS共享锁实现,其最核心的就是其中的计数器,调用countDown()方法计数器减1,当计数器为0时等待的线程获取到锁。

例子

public class CountDownLatchDemo {
    private static int LATCH_SIZE = 5;
    private static CountDownLatch doneSignal;

    public static void main(String[] args) {

        try {
            doneSignal = new CountDownLatch(LATCH_SIZE);

            // 新建5个任务
            for (int i = 0; i < LATCH_SIZE; i++)
                new InnerThread().start();

            System.out.println("main await begin.");
            // "主线程"等待线程池中5个任务的完成
            doneSignal.await();

            System.out.println("main await finished.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class InnerThread extends Thread {
        public void run() {
            try {
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + " sleep 1000ms.");
                // 将CountDownLatch的数值减1
                doneSignal.countDown();

                doneSignal.await();
                System.out.println("11111111111");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容