关于学习CountDownLatch(计数器)的总结随笔

阐述点:

  • CountDownLatch是什么?
  • CountDownLatch如何工作?
  • 在实时系统中的应用场景
  • 应用范例

CountDownLatch是什么?

     CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.通常的叫法是 计数器,是Java1.5引入的,其特性就是在多线程环境下,让主线程在等待所有的线程执行完毕之后,主线程才可以继续执行,否则则进入等待状态,CountDownLatch是以计数器来实现的,当每个线程完成之后,需要执行他的  countDown() 方法,来使计数器进行减一的操作,当计数器 为0的时候,则主线程才会继续往下执行, 下面会贴出示例代码.Java1.5一起被引入的还有 CyclicBarrier(栅栏),Semaphore(信号量),ConcurrentHashMap(线程安全),BlockingQueue ,它们都存在于java.util.concurrent包下.等有时间, 上面的几个依然也会写出博客,巩固自己.

关于学习CountDownLatch(计数器)的总结随笔_第1张图片

CountDownLatch如何工作?

    在创建一个CountDownLatch的时候有提供一个带参数的构造器,关于学习CountDownLatch(计数器)的总结随笔_第2张图片

在他的底层 有个内部类继承了 AQS机制(等空下来也会进行梳理 AQS机制,这里暂时不提),其实说白了就是为了实现 这个值的安全性操作,以及子线程进行减一的原子操作

关于学习CountDownLatch(计数器)的总结随笔_第3张图片

在调用 await() 方法的时候, 会进行上面的状态判断,当所有线程执行完毕之后,这里就会放开等待的主线程,让其继续执行下去

关于学习CountDownLatch(计数器)的总结随笔_第4张图片

在实时系统中的应用场景

  1. 实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。
  2. 开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。
  3. 死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁

应用范例

直接上代码:

public static void main(String[] args) throws InterruptedException {
    // 一个请求,后台需要调用多个接口 查询数据
    CountDownLatch cdLdemo = new CountDownLatch(10); // 创建,计数数值
    for (int i = 0; i < 10; i++) { // 启动九个线程,最后一个两秒后启动
        int finalI = i;
        new Thread(() -> {
            try {
                Thread.sleep(2000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("我是" + Thread.currentThread() + ".我执行接口-" + finalI +"调用了");
            cdLdemo.countDown(); // 参与计数
            // 不影响后续操作
        }).start();
    }

    cdLdemo.await(); // 等待计数器为0
    System.out.println("全部执行完毕.我来召唤神龙");
}

 

你可能感兴趣的:(工作随笔,Java基础)