首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

countdownlatch原理

CountDownLatch 是 Java 并发包中的一个同步工具类,它允许一个或多个线程等待其他线程完成一组操作。其核心原理是通过一个计数器来实现线程间的同步。在创建 CountDownLatch 时指定一个初始计数值,每当一个线程完成任务并调用 countDown 方法时,计数器的值就会减 1。当计数器的值减至 0 时,所有等待的线程会被释放继续执行。

基本概念

  • 作用:构建锁和同步器,进行线程的等待。
  • 使用场景:适用于在多线程的场景需要等待所有子线程全部执行完毕之后再做操作的场景。

优势

  • 简单易用:接口简洁,逻辑清晰,容易理解和实现。
  • 灵活性强:可以根据实际需求灵活设置计数值和等待线程的数量。
  • 线程安全:内部使用了有效的线程同步机制,保证了多线程环境下的正确性。

类型

CountDownLatch 是一次性的,一旦计数器减至 0,CountDownLatch 就无法再次使用,需要重新创建。

应用场景

例如,在多线程环境下,主线程需要等待其他线程完成一些初始化操作后才能继续执行。或者在一个并行计算任务中,需要等待所有子任务完成结果汇总。

工作原理

CountDownLatch 的内部实现基于 AbstractQueuedSynchronizer(AQS),通过一个名为 sync 的内部类来实现同步控制。sync 类继承自 AQS,并实现了 tryAcquireSharedtryReleaseShared 方法来控制对共享资源的访问。当调用 countDown 方法时,会尝试减少计数器的值,当计数器减至 0 时,调用 await 方法的线程将被释放。

示例代码

代码语言:txt
复制
import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);
        new Thread(() -> {
            System.out.println("Thread 1 已启动。。。");
            latch.countDown();
        }).start();
        new Thread(() -> {
            System.out.println("Thread 2 已启动。。。");
            latch.countDown();
        }).start();
        new Thread(() -> {
            System.out.println("Thread 3 已启动。。。");
            latch.countDown();
        }).start();
        latch.await();
        System.out.println("All threads completed。。。");
    }
}

在这个示例中,我们创建了一个 CountDownLatch 实例,并将需要等待的线程数设置为 3。然后,我们启动 3 个线程来执行任务,每个线程执行完任务后调用 countDown 方法将计数器减 1。最后,在主线程中我们调用 await 方法来使当前线程等待,直到所有线程完成任务并计数器减为 0 为止。

通过上述分析,我们可以看到 CountDownLatch 是一个简单而强大的同步工具,适用于多种多线程场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

    首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设计原理。...下面我们将分析其设计原理。 设计原理 CyclicBarrier调用await()方法是线程等待,await()方法源码如下: ?...CountDownLatch CountDownLatch的主要功能是实现几个计数器,使N个现场执行完成后当前线程才会继续执行下去。...输出: Thread-0执行完毕 Thread-1执行完毕 Thread-2执行完毕 Thread-3执行完毕 Thread-4执行完毕 主线程执行 原理分析 构造方法 ?...CountDownLatch主要用于某个线程等待N个线程执行完后等待的线程接着继续执行下去,不能够重复执行,CountDownLatch通过设施AQS state值来实现,每次调用counDown方法后都去唤醒正在等待的线程

    50920

    快速掌握并发编程---CountDownLatch原理和实战

    方法一 在前面的文章中我们介绍了Thread类的join方法:快速掌握并发编程---Thread常用方法,join的工作原理是,不停检查thread是否存活,如果存活则让当前线程永远wait,直到thread...但问题来了,如果面试官问你实现原理,你却回答不上来,就会给人你在瞎用的感觉,这样好不容易前面拿到点好印象结果被打回原型。...至于join的原理,建议去看看我之前发的线程常用方法里:快速掌握并发编程---Thread常用方法,那里面说的很清楚了,所这里就不在重复了。 今天我们着重了了CountDownLatch。...CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。...常用方法 构造方法 我们在上面的案例中 int threadCount = 5; CountDownLatch countDownLatch = new CountDownLatch(threadCount

    36640

    CountDownLatch、CyclicBarrier、Semaphore 的原理以及实例总结

    CountDownLatch、CyclicBarrier、Semaphore 的原理以及实例总结 在Java多线程编程中,有三种常见的同步工具类:CountDownLatch、CyclicBarrier...本文将对它们的原理和实例进行分析总结。 一、CountDownLatch CountDownLatch是一个计数器类,用来控制线程等待其他线程执行完毕再继续执行。...CountDownLatch的使用思路比较简单,首先创建一个CountDownLatch对象,并把需要等待的线程数量传入CountDownLatch的构造方法。...CyclicBarrier和CountDownLatch的区别在于,CountDownLatch只能使用一次,而CyclicBarrier可以重复使用。...总结 本文分析了CountDownLatch、CyclicBarrier、Semaphore三种常见的同步工具类的原理和实例。这些工具类可以帮助我们在多个线程之间进行协调,实现更高效的并发编程。

    20710

    JAVA并发编程系列(8)CountDownLatch核心原理

    在面试过程经常有算法题、模拟现实案例、经典功能设计、核心原理分析这种。这些看似简单,实际需要候选人有非常扎实的基础,才能应付这些八股考古面试。...一、面试真题:模拟拼团我们利用CountDownLatch倒计时的特性,多线程并发条件下,多线程可以调用CountDownLatch.countDown()方法进行减1,然后等候信号的线程调用CountDownLatch.await...()方法,等待CountDownLatch倒数为0,会被唤醒继续执行。...的核心原理 看了CountDownLatch源码,发现这个也是JUC家族兄弟,和之前说的《Semaphore信号量剖析》、《ReentrantLock核心原理剖析》有非常多相似的地方,都是AQS...AQS原理我们之前也说过《AQS原理剖析》,以及AQS底层通过CAS的实现,这个《JUC包之CAS原理》也有详细剖析。

    15610

    CountDownLatch

    CountDownLatch作用阻塞一个或多个线程等待其他线程完成操作。 定义初始化的时候,需要传入一个正数来初始化计数器**(0也可以,但这样定义没有实际意义)。...CountDownLatch通常用于多个线程之间的协调工作。 假设有如下情节: 同时获取5张表的数据并一同返回 为了让cpu更好的得到利用,程序执行效率更高,使用多线程来完成。...那么刚才也有说CountDownLatch是阻塞一个或多个线程等待其他线程完成操作,那么我们试一下。...需要减少的总次数 private static CountDownLatch countDownLatch = new CountDownLatch(5); public static...总体CountDownLatch的作用以及使用就没有了,很简单,大家可以多多尝试。在开发中用到非常多。

    53720

    Java Review - 并发编程_ CountDownLatch原理&源码剖析

    在CountDownLatch出现之前一般都使用线程的join()方法来实现这一点,但是join方法不够灵活,不能够满足不同场景的需要,所以JDK开发组提供了CountDownLatch这个类,使用CountDownLatch...实例 private static volatile CountDownLatch countDownLatch = new CountDownLatch(2); public static...子线程执行完毕后调用countDownLatch.countDown()方法让countDownLatch内部的计数器减1 所有子线程执行完毕并调用countDown()方法后计数器会变为0,这时候主线程的...join方法了,就是说countDownLatch相比join方法让我们对线程同步有更灵活的控制 类图关系 从类图可以看出,CountDownLatch是使用AQS实现的。...void await() 当线程调用CountDownLatch对象的await方法后,当前线程会被阻塞,直到下面的情况之一发生才会返回 当所有线程都调用了CountDownLatch对象的countDown

    23620

    Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    同时通过分析其原理,也可使我们做到知其然,并知其所以然。 这里首先来介绍一下 CountDownLatch 的用途,CountDownLatch 允许一个或一组线程等待其他线程完成后再恢复运行。...2.原理 2.1 CountDownLatch 的实现原理 CountDownLatch 的同步功能是基于 AQS 实现的,CountDownLatch 使用 AQS 中的 state 成员变量作为计数器...CountDownLatch 本身的原理并不难理解,不过如果大家想深入理解 CountDownLatch 的实现细节,那么需要先去学习一下 AQS 的相关原理。...3.1 CountDownLatch 源码分析 CountDownLatch 的原理不是很复杂,所以在具体的实现上,也不是很复杂。...CountDownLatch 的主要逻辑都是封装在 Sync 和其父类 AQS 里的。所以分析 CountDownLatch 的源码,本质上是分析 Sync 和 AQS 的原理。

    2.2K152

    面试官:说说CountDownLatch,CyclicBarrier,Semaphore的原理?

    CountDownLatch CountDownLatch适用于在多线程的场景需要等待所有子线程全部执行完毕之后再做操作的场景。...public class CountDownLatchTest { private static int num = 3; private static CountDownLatch countDownLatch...他和join()方法的区别就是join会阻塞子线程直到运行结束,而CountDownLatch可以在任何时候让await()返回,而且用ExecutorService没法用join了,相比起来,CountDownLatch...CountDownLatch基于AQS实现,volatile变量state维持倒数状态,多线程共享变量可见。...内部维护parties记录总线程数,count用于计数,最开始count=parties,调用await()之后count原子递减,当count为0之后,再次将parties赋值给count,这就是复用的原理

    54820

    CountDownLatch详解

    参考:Java并发编程的艺术 JDK版本:AdoptOpenJDK 11.0.2+9 1 概念 CountDownLatch允许一个或者多个线程去等待其他线程完成操作。...CountDownLatch接收一个int型参数,表示要等待的工作线程的个数。 当然也不一定是多线程,在单线程中可以用这个int型参数表示多个操作步骤。...2 方法 CountDownLatch 提供了一些方法: 方法 说明 await() 使当前线程进入同步队列进行等待,直到latch的值被减到0或者当前线程被中断,当前线程就会被唤醒。...Process finished with exit code 0 4 源码解析 4.1 Sync 内部类 CountDownLatch通过内部类Sync来实现同步语义。...这就是CountDownLatch的机制,尝试获取latch的线程只有当latch的值减到0的时候,才能获取成功。

    21320

    Java并发学习之CountDownLatch实现原理及使用姿势

    CountDownLatch实现原理及使用姿势 在并发编程的场景中,最常见的一个case是某个任务的执行,需要等到多个线程都执行完毕之后才可以进行,CountDownLatch可以很好解决这个问题 下面将主要从使用和实现原理两个方面进行说明...,围绕点如下 CountDownLatch 是个什么鬼 怎么用(结合case说明) 底层实现原理(及如何保障功能的正常性) I....await(long, TimeUnit)来替代直接使用await()方法,至少不会造成阻塞死只能重启的情况 有兴趣的小伙伴可以对比下这个实现与 《Java并发学习之ReentrantLock的工作原理及使用姿势...实现原理 同ReentrantLock一样,依然是借助AQS的双端队列,来实现原子的计数-1,线程阻塞和唤醒 前面《Java并发学习之ReentrantLock的工作原理及使用姿势》 介绍了AQS的结构...实现原理 await内部实现流程: 判断state计数是否为0,不是,则直接放过执行后面的代码 大于0,则表示需要阻塞等待计数为0 当前线程封装Node对象,进入阻塞队列 然后就是循环尝试获取锁,直到成功

    12.4K142

    Java多线程并发控制工具CountDownLatch,实现原理及案例

    倒计数器的初始值在构建CountDownLatch对象时指定,它表示我们需要等待的条件个数。await方法能让线程进入等待状态,等待的条件是倒计数器的值大于0。...实现原理 先前介绍过如何基于AQS同步器实现一个自定义同步器,实际上CountdownLatch也是基于AQS来实现的,只要使用AQS的共享模式即可以轻松实现闭锁。...下面我们看详细的实现代码,CountdownLatch类的构造函数需要传入一个整型参数,表示倒计数器的初始值,对应着AQS的state状态变量。...按照官方推荐的自定义同步器的做法,将继承了AQS类的子类Sync作为CountdownLatch类的内部类,而CountdownLatch同步器中相关的操作只需代理成子类中对应的方法即可。...案例 2 第二个例子是创建一个CountdownLatch对象作为倒计数器,其值为2。

    2K70
    领券