CountDownLatch - 倒计时锁

简介: CountDownLatch - 倒计时锁

一、什么是倒计时锁



CountDownLatch倒计时锁特别适合”总-分任务”,例如多线程计算后的数据汇总

CountDownLatch类位于java.util.concurrent(J.U.C)包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他3个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。


二、执行原理


image.png


image.png


通俗的来讲先定义一个初始量,如CountDownLatch=3,定义之后,主线程会进入到阻塞状态,每当线程执行一次任务之后,便会进行递减一次定义的初始值的操作,当定义的初始值为0时,便会唤醒主线程,进行执行。


三、代码示例


package com.caiweiwei.lianxi.controller;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownSample {
    private static int count=0;
    public static void main(String[] args) {
        ExecutorService executorService= Executors.newFixedThreadPool(100);
        CountDownLatch countDownLatch=new CountDownLatch(1000);//CDL总数和操作数保持一致
        for (int i=1;i<=1000;i++){
            final  int index=i;
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    synchronized (CountDownSample.class){
                        try{
                            count = count + index;
                        }catch (Exception e){
                            e.printStackTrace();
                        }finally {
                            //计数器减一
                            countDownLatch.countDown();
                        }
                    }
                }
            });
        }
        try{
            countDownLatch.await();//堵塞当前线程,知道cdl=0的时候再继续往下走
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(count);
        executorService.shutdown();
    }
}



相关文章
|
8月前
|
设计模式 Java
CountDownLatch和CyclicBarrier源码详解
我现在有个场景:现在我有50个任务,这50个任务在完成之后,才能执行下一个函数,要是你,你怎么设计?可以用JDK给我们提供的线程工具类,CountDownLatch和CyclicBarrier都可以完成这个需求。基于AQS实现,会将构造CountDownLatch的入参传递至statecountDown()就是在利用CAS将state减1,await)实际就是让头节点一直在等待state为0时,释放所有等待的线程。
76 1
|
8月前
|
Java 测试技术
CountDownLatch、CyclicBarrier让线程听我号令
CountDownLatch、CyclicBarrier让线程听我号令
85 0
|
5月前
|
Java
CountDownLatch、CyclicBarrier 使用区别
CountDownLatch、CyclicBarrier 使用区别
42 1
|
8月前
|
Java 数据库连接 mybatis
CountDownLatch(倒计时器)源码解读与使用
CountDownLatch(倒计时器)源码解读与使用
|
8月前
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
74 0
信号量(Semaphore)与线程计数器(CountDownLatch)(详解)
|
8月前
多线程并发之CountDownLatch(闭锁)使用详解
多线程并发之CountDownLatch(闭锁)使用详解
434 0
CountDownLatch和CyclicBarrier的区别
CountDownLatch和CyclicBarrier的区别
43 0
|
Java 开发工具 git
【Java多线程】如何正确使用倒计时协调器:CountDownLatch
CountDownLatch可以用来实现一个或者多个(注意可以有多个)线程,等待其他线程完全一组特定的操作后,才开始继续执行的操作,这些特定的操作被称作先决条件。
247 2
[并发控制]CountDownLatch和CyclicBarrier
[并发控制]CountDownLatch和CyclicBarrier
72 0
深入理解JUC:第四章:CountDownLatch倒计时器
深入理解JUC:第四章:CountDownLatch倒计时器
深入理解JUC:第四章:CountDownLatch倒计时器