CountDownLatch原理以及使用案例

Java多线程并发控制工具CountDownLatch,实现原理及案例 跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理。 作者简介:笔名seaboat,擅长工程算法、人工智能算法、自然语言处理、架构、分布式、高并发、大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java、Python和C++。平时喜欢看书、写作和运动,擅长篮球、跑步、游泳、健身和羽毛球等运动项目。崇尚开源,崇尚技术自由,更崇尚思想自由。出版书籍:《... 阅读详情

CountDownLatch介绍

CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。

CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下

CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。

CountDownLatch原理

CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。

注:这是一个一次性操作 - 计数无法重置。 如果你需要一个重置的版本计数,考虑使用CyclicBarrier。

CountDownLatch原理示意图

CountDownLatch 内部结构

1.Sync 是一个静态内部类 继承 AbstractQueuedSynchronizer

 /**
     * CountDownLatch的同步控制器
     * 使用AQS状态表示计数。
     */
    private static final class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = 4982264981922014374L;
 
        //构造方法 CountDownLatch 的构造方法最终调用的是 Sync的构造。
        Sync(int count) {
            setState(count); //初始化count
        }
 
        //返回当前count 计数
        int getCount() {
            return getState();
        }
 
        // 试图在共享模式下获取对象状态
        protected int tryAcquireShared(int acquires) {
            return (getState() == 0) ? 1 : -1;
        }
        // 试图设置状态来反映共享模式下的一个释放
        protected boolean tryReleaseShared(int releases) {
            // Decrement count; signal when transition to zero
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }
    }

注:从源码可知,其底层是由AQS提供支持。AQS 见下章分解。

2. await()

           此函数将会使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。其源码如下  

    public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }
 
   //-----------------------------------------------------------
 
    public final void acquireSharedInterruptibly(int arg)
            throws InterruptedException {
        if (Thread.interrupted())
            throw new InterruptedException();
        //这里可以看到 最终调用的是Sync中的 tryAcquireShared 方法 
        // return (count == 0) ? 1 : -1;
        if (tryAcquireShared(arg) < 0)
            doAcquireSharedInterruptibly(arg);
    }
 
 
//-------------------------------------------------------
 
 
    public boolean await(long timeout, TimeUnit unit)
        throws InterruptedException {
        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
    }

3.countDown() 

  此函数将递减锁存器的计数,如果计数到达零,则释放所有等待的线程  

   /**   
     * count值减 1,直到计数达到零,释放所有等待的线程 。
     *      
     *  <p>如果当前计数大于零,则递减。
     *   如果新计数为零,则重新启用所有等待的线程 ,达到线程调度的目的。
     *      
     * <p>如果当前计数等于零,则没有任何反应。
     */
    public void countDown() {
        sync.releaseShared(1);
    }
 
//-------------------------------------------------------------------------
   /**
     * 此函数会以共享模式释放对象,
     * 并且在函数中会调用到CountDownLatch的tryReleaseShared函数,
     * 当且仅当新计数返回0时,会调用AQS的doReleaseShared函数, 
     */
    public final boolean releaseShared(int arg) {
        if (tryReleaseShared(arg)) {
            doReleaseShared();
            return true;
        }
        return false;
    }

*CountDownLatch和CyclicBarrier区别:
1.countDownLatch是一个计数器,线程完成一个记录一个,计数器递减,只能只用一次
2.CyclicBarrier的计数器更像一个阀门,需要所有线程都到达,然后继续执行,计数器递增,提供reset功能,可以多次使用

CountDownLatch 使用示例

示例1

package com.kids.web.countdownlatch;
 
import java.util.concurrent.CountDownLatch;
 
public class Worker implements Runnable {
 
    private int num;
 
    private final CountDownLatch startSignal;
    private final CountDownLatch doneSignal;
 
    Worker(CountDownLatch startSignal, CountDownLatch doneSignal, int num) {
        this.startSignal = startSignal;
        this.doneSignal = doneSignal;
        this.num = num;
    }
 
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
            System.out.println("do startSignal.await() before");
            startSignal.await();
            System.out.println("do startSignal.await() after");
 
            doWork();
            doneSignal.countDown();
            System.out.println("===count =" + doneSignal.getCount() + "========== num =" + num);
 
        } catch (InterruptedException ex) {
        } // return;
    }
 
    void doWork() {
        System.out.println("do work..." + num);
    }
}
package com.kids.web.countdownlatch;
 
import java.util.concurrent.CountDownLatch;
 
public class Driver {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch startSignal = new CountDownLatch(1);
        int N = 10;
        CountDownLatch doneSignal = new CountDownLatch(N);
 
        for (int i = 0; i < N; ++i) // create and start threads
            new Thread(new Worker(startSignal, doneSignal,i)).start();
 
        doSomethingElse1();            // don't let run yet
        Thread.sleep(1000 * 5);
        startSignal.countDown();      // let all threads proceed
        doSomethingElse2();
        Thread.sleep(1000 * 5);
        doneSignal.await();           // wait for all to finish
    }
 
    private static void doSomethingElse1() {
        System.out.println("====================startSignal.countDown() before");
    }
 
    private static void doSomethingElse2() {
        System.out.println("====================startSignal.countDown() after");
    }
}

====================startSignal.countDown() before
do startSignal.await() before ----count=1 ---- num =0
do startSignal.await() before ----count=1 ---- num =2
do startSignal.await() before ----count=1 ---- num =4
do startSignal.await() before ----count=1 ---- num =1
do startSignal.await() before ----count=1 ---- num =3
====================startSignal.countDown() after
do startSignal.await() after  ----count=0 ---- num =3
do startSignal.await() after  ----count=0 ---- num =1
do startSignal.await() after  ----count=0 ---- num =4
do startSignal.await() after  ----count=0 ---- num =2
do work...2
doneSignal.countDown()===count =4========== num =2
do startSignal.await() after  ----count=0 ---- num =0
do work...0
do work...4
doneSignal.countDown()===count =2========== num =4
do work...1
doneSignal.countDown()===count =1========== num =1
do work...3
doneSignal.countDown()===count =0========== num =3
doneSignal.countDown()===count =3========== num =0

等待其他线程执行完毕

Process finished with exit code 0

说明:通过示例结果中可以看出,在startSignal调用countDown()之前程序在startSignal.await() 处堵塞,

此时startSignal的count为1。在startSignal调用countDown()之后,count =0 时 开始执行startSignal.await()之后的业务逻辑。

doneSignal调用countDown() 直到其count=0 回到主线程。等待doneSignal调用await()结束。

注意:doneSignal最终不调用await() 的话 该线程始终处于等待状态。(本人也不知具体原因,在await 方法中 如果计数为0的话并没有处理任何事情。而且通过sleep 看到只有doneSignal的计数为0后才会返回主线程执行。)

示例2

package com.kids.web.countdownlatch;
 
import java.util.concurrent.CountDownLatch;
 
public class Worker2 implements Runnable {
 
    private final CountDownLatch doneSignal;
    private final int i;
 
    public Worker2(CountDownLatch doneSignal, int i) {
        this.doneSignal = doneSignal;
        this.i = i;
    }
 
    public void run() {
        doWork(i);
        doneSignal.countDown();
        System.out.println("=============count =" + doneSignal.getCount() + "------- i =" + i);
    }
 
    void doWork(int i) {
        System.out.println("do work..." + i);
    }
}
package com.kids.web.countdownlatch;
 
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
 
public class Driver2 {
    public static void main(String[] args) throws InterruptedException {
        int N = 20;
        CountDownLatch doneSignal = new CountDownLatch(N);
        Executor e = Executors.newFixedThreadPool(1);
 
        for (int i = 0; i < N; ++i) // create and start threads
            e.execute(new Worker2(doneSignal, i));
        doneSignal.await();           // wait for all to finish
    }
 
}

do work...0
=============count =19------- i =0
do work...1
=============count =18------- i =1
do work...2
=============count =17------- i =2
do work...3
=============count =16------- i =3
。。。。。。

。。。。。。

do work...18
=============count =1------- i =18
do work...19
=============count =0------- i =19

说明:这里 Executor e = Executors.newFixedThreadPool(1); 只是为了可以从打印结果中更直观的看出 count的递减。


实例3

用CountDownLatch 来优化我们的报表统计

功能现状

运营系统有统计报表、业务为统计每日的用户新增数量、订单数量、商品的总销量、总销售额......等多项指标统一展示出来,因为数据量比较大,统计指标涉及到的业务范围也比较多,所以这个统计报表的页面一直加载很慢,所以需要对统计报表这块性能需进行优化。

问题分析

统计报表页面涉及到的统计指标数据比较多,每个指标需要单独的去查询统计数据库数据,单个指标只要几秒钟,但是页面的指标有10多个,所以整体下来页面渲染需要将近一分钟。

解决方案

任务时间长是因为统计指标多,而且指标是串行的方式去进行统计的,我们只需要考虑把这些指标从串行化的执行方式改成并行的执行方式,那么整个页面的时间的渲染时间就会大大的缩短, 如何让多个线程同步的执行任务,我们这里考虑使用多线程,每个查询任务单独创建一个线程去执行,这样每个统计指标就可以并行的处理了。

要求

因为主线程需要每个线程的统计结果进行聚合,然后返回给前端渲染,所以这里需要提供一种机制让主线程等所有的子线程都执行完之后再对每个线程统计的指标进行聚合。 这里我们使用CountDownLatch 来完成此功能。

模拟代码

1、分别统计4个指标用户新增数量、订单数量、商品的总销量、总销售额;

2、假设每个指标执行时间为3秒。如果是串行化的统计方式那么总执行时间会为12秒。

3、我们这里使用多线程并行,开启4个子线程分别进行统计

4、主线程等待4个子线程都执行完毕之后,返回结果给前端。

​
    //用于聚合所有的统计指标
    private static Map map=new HashMap();
    //创建计数器,这里需要统计4个指标
    private static CountDownLatch countDownLatch=new CountDownLatch(4);
​
    public static void main(String[] args) {
​
        //记录开始时间
        long startTime=System.currentTimeMillis();
​
        Thread countUserThread=new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("正在统计新增用户数量");
                    Thread.sleep(3000);//任务执行需要3秒
                    map.put("userNumber",1);//保存结果值
                    countDownLatch.countDown();//标记已经完成一个任务
                    System.out.println("统计新增用户数量完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
​
            }
        });
        Thread countOrderThread=new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("正在统计订单数量");
                    Thread.sleep(3000);//任务执行需要3秒
                    map.put("countOrder",2);//保存结果值
                    countDownLatch.countDown();//标记已经完成一个任务
                    System.out.println("统计订单数量完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
​
            }
        });
​
        Thread countGoodsThread=new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("正在商品销量");
                    Thread.sleep(3000);//任务执行需要3秒
                    map.put("countGoods",3);//保存结果值
                    countDownLatch.countDown();//标记已经完成一个任务
                    System.out.println("统计商品销量完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
​
            }
        });
​
        Thread countmoneyThread=new Thread(new Runnable() {
            public void run() {
                try {
                    System.out.println("正在总销售额");
                    Thread.sleep(3000);//任务执行需要3秒
                    map.put("countmoney",4);//保存结果值
                    countDownLatch.countDown();//标记已经完成一个任务
                    System.out.println("统计销售额完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
​
            }
        });
        //启动子线程执行任务
        countUserThread.start();
        countGoodsThread.start();
        countOrderThread.start();
        countmoneyThread.start();
​
        try {
            //主线程等待所有统计指标执行完毕
            countDownLatch.await();
            long endTime=System.currentTimeMillis();//记录结束时间
            System.out.println("------统计指标全部完成--------");
            System.out.println("统计结果为:"+map.toString());
            System.out.println("任务总执行时间为"+(endTime-startTime)/1000+"秒");
​
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
​
​
    }

执行结果

preview

 

 

 

 

 

 

Java 并发编程:多线程并发控制工具 CountDownLatch,实现原理及案例 闭锁(CountDownLatch)是Java多线程并发中的一种同步器,它是JDK内置的同步器。通过它可以定义一个倒计数器,当倒计数器的值大于0时,所有调用await方法的线程都会等待。而调用countDown方法则可以让倒计数器的值减一,当倒计数器值为0时所有等待的线程都将继续往下执行。 闭锁的主要应用场景是让某个或某些线程在某个运行节点上等待N个条件都满足后才让所有线程继续往下执行,其中倒计数器的值为N,每满足一个条件倒计数器就减一。比如下图中,倒计数器初始值为3,然后三个线程调用await方法后都在 阅读详情

相关推荐

C# : 计算并输出这一天是这一年的第几天

C#之输入某年,然后输入某月,再输入某日,计算并输出这一天是这一年的第几天的功能算法

saitoDeng的博客 969

CountDownLatch详解

概述 CountDownLatch概念 CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,用来作为线程间的通信而不是互斥作用。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。 使用一个计数器进行实现,计数器初始值就是线程的数量。 当每个被计数的线程完成任务后,计数器值减一,当计数器的值为0时,表示所有线程都已经完成了任务,然后在CountDownLatch上等待的线程就可以恢复执行。 CountDownLatch的用法 ...

抽象的螺旋 2万+

Python控制tek示波器(1)

如何使用Python来控制tek示波器

m0_47441496的博客 3379

CountDownLatch介绍和使用【Java多线程必备】

CountDownLatch介绍、特性、注意事项、使用案例(干货满满)

Mr.绵羊的知识星球 3万+

NVIDIA Isaac平台体验:Isaac Sim与Isaac ROS的快速了解

NVIDIA Isaac平台是一个专为机器人和人工智能(AI)打造的加速平台,旨在为开发者提供一个全面的工具集,以加速机器人相关应用的开发和部署。材质定义语言(MDL)是一种用于描述材质属性和行为的编程语言,能够精确地定义材质的光学特性和物理属性。NVIDIA Isaac Sim 通过支持 MDL,进一步提升了仿真环境中材质的真实感和细节表现。精确的材质定义:MDL 允许开发者精确地定义材质的光学特性和物理属性,如反射率、折射率、粗糙度和透明度等。这使得仿真环境中的物体看起来更加真实和自然。动态材质。

全世界的博客 4万+

修复zookeeper未授权访问漏洞

【代码】修复zookeeper未授权访问漏洞。

qq_28392947的博客 4067

CountDownLatch详解以及用法示例

一、什么是countDownlatch CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复执行任务。 二、方法详解 CountDownLatch(int count):count为计数器的初始值(一般需要多少个线程执行,count就设为几)。 countDown(): 每调用一次计数器值-1,直到count被减为0,代表所有线程全部执行完毕

liu_da_da的博客 4万+

LayaNative源码编译

修改好后的LayaNative2.0需要重新编译生成Android和iOS所需要的动态库文件。

末之 1358

Java并发之CountDownLatch的基本使用

利用CountDownLatch进行线程间同步,可以控制其线程的执行时序,谁先执行、谁后执行,利用好CountDownLatch即可1、CountDownLatch类的内部维护一个初始值,该值称为计数器,主线程执行await()方法时,如果计数器值大于0时,主线程将会被阻塞,当另外的线程完成任务后,调用CountDownLatch对象的coutDown()方法时,计数器值就会减12、当这个计数器值等于0时,处于阻塞等待的线程将会被唤醒,则可以继续执行程序了!

王员外的博客 6693

petalinux2022.2启动文件编译配置

petalinux2021之前的版本里,导入目录components/yocto/下的“environment-setup-aarch64-xilinx-linux” 和 “layers/core/oe-init-build-env”的环境,能使用Yocto的devtool工具。(加入下面内容,先petalinux-build下载完成后才能有源码)制作 BOOT.BIN 启动文件:petalinux-package --boot --fsbl --fpga --u-boot --force。

wangjie36的博客 1388

37、基于视觉的轻量级面部呼吸和心率测量技术

本文提出了一种基于视觉的轻量级面部呼吸和心率测量技术,通过远程光电容积脉搏波描记法(RPPG)和面部振动信息实现非接触式生理信号采集。创新性地结合框选和特征点选择多个感兴趣区域(ROI),并采用光流跟踪、主成分分析(PCA)和集成经验模态分解(EEMD)等方法优化信号处理流程。实验结果表明,该方法在测量精度和稳定性方面优于传统方法,并可在树莓派4等低功耗平台上实现实时运行,具有广泛的应用前景。

r7s8t的博客 307

CountDownLatch 基本工作原理和使用案例

定义:一种多功能的同步工具,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。字面可以翻译为“倒计时锁存器”。 功能:使用给定的计数初始化CountDownLatch。由于countCount方法的调用,直到当前计数达到零为止,await方法将阻塞,此后所有释放的线程将被释放,并且任何随后的await调用将立即返回。这是一种一次性现象-无法重置计数。如果需要用于重置计数的版本,请...

小方编程的专栏 904

逆强化学习:从专家示范中学习策略

逆强化学习(Inverse Reinforcement Learning,简称IRL)是强化学习(Reinforcement Learning,简称RL)的一个子领域,它的目标是从专家的行为中学习策略。在传统的强化学习中,智能体通过与环境交互,根据奖励信号来学习一个策略。而在逆强化学习中,我们没有直接的奖励信号,而是通过观察专家的行为来推断出奖励函数,从而学习到一个与专家类似的策略。逆强化学习作为强化学习的一个重要子领域,在许多实际应用场景中都取得了显著的成功。

AI天才研究院 1449

CountDownLatch的使用和原理分析

一. 什么是CountDownLatch    CountDownLatch: 又称闭锁,CountDownLatch 这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。   CountDownLatch 是通过一个计数器来实现的,计数器的初始值为初始任务的数量。每当完成了一个任务后,计数器的值就会减 1 (CountDownLatch.countDown()方法)。当计数器值到达 0 时,它表示所有的已 经完成了任务

无痕的博客 420

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

浅析CountDownLatch用法

1、CountDownLatch是什么 CountDownLatch可以控制线程的执行,他可以让所有持有他的多个线程同时执行,也可以控制单个线程执行。 他初始化的时候会传出一个int类型的参数i,调用一次countDown()方法后i的值会减1。 在一个线程中如果调用了await()方法,这个线程就会进入到等待的状态,当参数i为0的时候这个线程才继续执行。 await() 方法:在Count...

luoyeyeyu的专栏 352

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【线程池】线程同步器CountDownLatch

CountDownLatch的原理和ReentrantLock的原理类似,都是基于AQS实现的。CountDownLatch 用于阻塞当前 1 个或多个线程,其目的是让这些线程等待其它线程的执行完成。可以简单将其理解为一个计数器,当初始化一个 count=n 的 CountDownLatch 对象之后,需要调用该对象的 CountDownLatch#countDown 方法来对计数器进行减值,直到计数器为 0 的时候,等待该计数器的线程才能继续执行。

weixin_44823875的博客 6040

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

CountDownLatch的2种使用场景

CountDownLatch是基于AQS的操作共享锁的表现,可以控制多个线程,一起执行。模仿并发 CountDownLatch类中有2个方法。1. await();表示线程阻塞, 2. countDown();表示,计数器减一。在线程阻塞后,计数器减至0后才可以唤醒阻塞的线程。 场景一:模仿高并发,多个线程,同事访问一个资源。 代码: package com.example.demo2.cusdemo.countdowndemo; import java.util.concurrent.C.

wangfenglei123456的博客 1709

什么时候使用CountDownLatch

什么时候使用CountDownLatch 正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。在这篇文章中,我将会涉及到在Java并发编 程中跟CountDownLatch相关的以下几点: 目录 C...

LTCM_SAKURA的博客 154

【Java】【多线程】CountdownLatch使用方法说明

本文目录结构CountDownLatch基本概念CountDownLatch重点方法介绍CountDownLatch适用场景说明CountDownLatch使用案例 CountDownLatch基本概念 CountDownLatch是在java1.5被引入的,CountDownLatch是一个同步工具类,用来协调多个线程之间的同步(或者说是线程之间的通信)。 CountDownLatch能够使一个...

chengyun19830206的博客 610

CountDownLatch 闭锁源码分析

功能简介闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态【CPJ 3.4.2】。闭锁的作用相当于一扇门∶ 在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以用来确保某些活动直到其他活动都完成后才继续执行,例如∶确保某个计算在其需要的所有资源都被初始化之后才继续执行。二元闭锁(包括两个状态)可以用来表示"资源R已经被初始化",而所有需要 R 的操作都必须

wanger5354的博客 178

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

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33871366的博客 130

Java并发包中线程同步器之CountDownLatch的简单使用及原理简介

使用背景 在开发过程中经常会在主线程中去开多个线程并行执行任务,并且主线程需要等所有子线程执行完毕汇总的场景。 CountDownLatch 在CountDownLatch出现之前一般都采用join()方法来实现,但不够灵活。下面来一个使用案例: package concurrentProgramming; import java.util.concurrent.CountDownLatch; public class CountDownLatchTest1 { //创建一个CountDown

weixin_42643321的博客 227

CountDownLatch 使用&核心原理 图解

疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 面试必备 + 面试必备 【博客园总入口 】 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 大厂必备 + 大厂必备 + 大厂必备 【博客园总入口 】 入大厂+涨工资必备: 高并发【 亿级流量IM实战】 实战系列 【 SpringCloud Nginx秒杀】 实战系列 【博客园总入口 】 并发工具类 系列文章: 1 Cy..

架构师尼恩 783

CountDownLatch 使用

正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。在这篇文章中,我将会涉及到在Java并发编 程中跟CountDownLatch相关的以下几点: 目录 CountDownLatch是什么? C...

weixin_30535043的博客 162

CountDownLatch 学习与实战

为了方便于大家更快的知道这篇文章写了啥,这里呢说一点不太重要的废话,这边文章呢,会从 `CountDownLatch` 基础的知识点介绍起,然后结合一个具体的例子讲解下,最后呢,来一个实际的应用,好了,我们开始吧。另外这篇文章主要是讲的是怎么使用,并不是原理性的。文章的最后附上一个使用 CountDownLatch 实现的文件分片处理案例

Wayfreem的博客 500
上一篇: 高并发编程之CopyOnWriteArrayList介绍
下一篇: Semaphore 使用及原理
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值