CountDownLatch源码走读

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

代码走读

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

CountDownLatch源码走读_第1张图片

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();
            }
        }
    }
}

你可能感兴趣的:(CountDownLatch源码走读)