美文网首页
CountDownLatch源码走读

CountDownLatch源码走读

作者: 忘净空 | 来源:发表于2017-12-02 15:28 被阅读17次

    并发工具类中,我们简单了解了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();
                }
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:CountDownLatch源码走读

          本文链接:https://www.haomeiwen.com/subject/xjpnbxtx.html