Java并发编程(9)-CountDownLatch

『死磕Java并发编程系列』并发编程工具类之CountDownLatch 《死磕 Java 并发编程》系列连载中,大家可以关注一波: ????????『死磕Java并发编程系列』 01 十张图告诉你多线程那些破事 『死磕Java并发编程系列』 02 面试官:说说什么是Java内存模型? 『死磕Java并发编程系列』 03 面试必问的CAS原理你会了吗? 『死磕Java并发编程系列』 04 面试官:说说Atomic原子类的实现原理? ????????『死磕Java并发编程系列』 05 图解Java中那18 把锁 在日常编码中,Java 并发编程可是少不了,试试下面这些并 阅读详情


更多关于Java并发编程的文章请点击这里:Java并发编程实践(0)-目录页


本文将介绍什么是闭锁,在java中的闭锁实现:CountDownLatch类及其常用方法等,最后给出了一个使用闭锁模拟线程并发的demo,用以简单地测试任务是否为线程安全。

一、什么是闭锁

闭锁(Latch)是在并发编程中常被提及的概念。闭锁是一种线程控制对象,它能让所有的线程在某个状态时终止工作并等待,直到闭锁“开门”时,所有的线程在这一刻会几乎同时执行工作,制造出一个并发的环境。

二、CountDownLatch类介绍

2.1、什么是CountDownLatch

CountDownLatch,顾名思义,可以理解为计数(count)、减少(down)、闭锁(Latch),即通过计数减少的方式来达到阻碍线程执行任务的一种闭锁,这个类位于java.util.concurent并发包下,是java中闭锁的最优实现。

2.2、构造方法

CountDownLatch(int count)
构造器中计数值(count)就是闭锁需要等待的线程数量,这个值只能被设置一次。

2.3、主要方法
  • void await():
    使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。

  • boolean await(long timeout, TimeUnit unit):
    使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。

  • void countDown():
    递减锁存器的计数,如果计数到达零,则释放所有等待的线程。

  • long getCount():
    返回当前计数。

  • String toString():
    返回标识此锁存器及其状态的字符串。

三、闭锁的使用

1.一个计数器使用的例子:主线程等待其他所有线程执行完毕在执行
public class CountDownLatchDemo {
    private static int counter = 0;

    public static void main(String[] args) throws InterruptedException {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                0, // corePoolSize
                Integer.MAX_VALUE, // maxPoolSize
                60L,
                TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>()
        );
        int count = 5;
        CountDownLatch latch = new CountDownLatch(count);
        for (int i = 0; i < count; i++) {
            threadPoolExecutor.execute(() -> {
                try {
                    run();
                } catch (Exception e) {
                }finally {
                    latch.countDown();
                }
            });
        }
        latch.await();
        threadPoolExecutor.shutdown();
        System.out.println("线程执行完毕");
    }

    private static void run() throws InterruptedException {
        Thread.sleep(1000);
        System.out.println(Thread.currentThread());

    }
}

在这里插入图片描述

2.一个并发测试的例子:将所有的子线程全部阻塞在一个入口,等待主线程统一放行
public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        CountDownLatch countDownLatch = new CountDownLatch(1);
        int i = 0;
        for (i = 0; i <= 50; i++) {
            final int num = i;
            executorService.submit(()->{
                try {
                    countDownLatch.await();
                    System.out.println(String.format("线程%s打印%d", Thread.currentThread().getName(), num));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        Thread.sleep(5000);

        System.out.println("FINISHED");
        countDownLatch.countDown();
        executorService.shutdown();
    }

可以看到执行结果中,counter的值出现了并发冲突:
在这里插入图片描述
这时可以使用原子类AtomicInteger,通过CAS去自增计数器的值(为什么不使用volatile呢?因为volatile虽然能保证多线程读写共享变量的可见性,但修改一个变量并写入毕竟是分为读-改-写这三个过程的,所以仍需要使用CAS来保障)。

private static AtomicInteger counter = new AtomicInteger();
    private static void run() throws InterruptedException {
        // 使用原子类 CAS更新值
        System.out.println(Thread.currentThread() + ":" + counter.incrementAndGet());
    }
Java并发编程中的Semaphore与CountDownLatch对比 控制同时访问资源的线程数量(例如限制数据库连接池的最大连接数);等待多个子任务完成后再执行主任务(例如多线程下载文件后合并结果)。Semaphore和正是为这两种需求设计的工具。本文将深入对比它们的原理、用法和适用场景,覆盖从基础概念到实战的全流程。用生活案例引出Semaphore和的核心作用;结合源码和AQS(抽象队列同步器)讲解底层原理;通过代码示例对比两者的使用差异;总结实际开发中的选择策略。Semaphore:通过“许可”控制同时访问资源的线程数,像停车场的停车票管理器; 阅读详情

相关推荐

Visual Tracker Benchamark傻瓜式教程(二)

问题  1 1  在调用main.m跑TRE和SRE时,因为会生成相应的.mat数据文件,如果跑完以后发现自己算法生成的.mat文件有问题,那么要把该文件删除,待找到错误原因后,重新生成相应的.mat文件。因为程序中写的是如果已经存在了.mat文件,例如已经存在car4_STC.mat文件,即使该文件中的数据有错误,但是重新跑时会默认该文件中的数据写完,不会重新写入数据 问题  2  b

mingbujingren的专栏 9928

多线程的应用与原理分析8(countdownlatch)

限制 JUC中提供了几个比较常用的并发工具类,比如CountDownLatch、CyclicBarrier、Semaphore。CountDownLatch countdownlatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行。从命名可以解读到countdown是倒数的意思,类似于我们倒计时的概念。 countdownlatc...

zy345293721的博客 328

深信服PT1-AF实验考试

深信服PT1-AF实验考试实验练习可以去深信服的在线实验平台(链接如下):深信服在线实验平台 (sangfor.com.cn)实验考试其实就是把所有的每一部分实验综合了起来以下内容仅做参考,不确保一样。

m0_72019240的博客 7122

解析Concurrent包下的ReentrantLock、LockSupport、AQS

本文转自老马编程,微信公众号:laoma_shuoJava并发包中的显式锁接口和类位于包java.util.concurrent.locks下,主要接口和类有: 锁接口Lock,主要实现类是ReentrantLock 读写锁接口ReadWriteLock,主要实现类是ReentrantReadWriteLock本节主要介绍接口Lock和实现类ReentrantLock,关于读写锁,我们后续章节介

SmuEdward的博客 1203

手把手教你用光耦搭建安全隔离电路:从洗衣机控制板到PLC输入模块实战

本文通过洗衣机控制板驱动高压电机和PLC输入模块采集现场信号两个实战场景,手把手教你使用光耦搭建安全隔离电路。文章详细解析了电路架构、关键器件选型、参数计算、仿真验证及PCB布局避坑技巧,并对比了光耦与数字隔离器的适用场景,帮助电子工程师掌握这门保障系统稳定与安全的必备技能。

h6j7k8l9p0的博客 463

遥感生态指数(RSEI)——四个指数的计算

遥感生态指数是在4个生态指数的基础上通过主成分变换得出的一个评价生态环境质量的指标。因此,第二部分就是要分别计算出这4个指数的值。 ①首先,是绿度指数的计算,一般用归一化植被指数(NDVI) NDVI=(NIR-Red)/(NIR+Red) 在Bandmath工具中输入NDVI计算公式 (float(b4-b3))/(b4+b3) 其中,b3、b4分别是红波段和近红外波段 ②其次,是湿度计算。 WET = c1B1 + c2B2 + c3B3...

qq_41978498的博客 9万+

揭秘CountDownLatch线程同步机制:如何优雅实现多线程等待与协作

掌握Java并发编程关键技巧,详解CountDownLatch如何优雅实现多线程等待与同步协作。适用于主线程等待多个任务完成的场景,通过countDown()和await()方法高效控制线程协调。原理清晰、用法简单,提升程序并发性能,值得收藏。

LogicShoal的博客 780

库卡机器人负载设置和自动负载测算

1.1在专家或者以上的权限下—“投入运行”——“工具/基座标管理”—“工具/工件”—添加1.2根据当前的工具所在的tool选择指定工具号;若是没有建立tool需要先建立建立方法看1.3负载数据的填写质量:抓手自重+产品重量总和(需要小于额定负载值)X、Y、Z :总质量的重心位置(基于法兰盘中心的位置计算,如下图的X_FLANGE、Y_FLANGE、Z_FLANGE)【此数据可以根据仿真或者CAD数据得出】A、B、C:是总质量绕着法兰盘中心所安装的角度位置 【此数据可以根据仿真或者CAD数据得出】

weixin_43462131的博客 3117

Java并发编程:锁、内存可见性与同步控制,synchronized关键字中锁的掌握,volatile关键字中内存可见性的保障,CountDownLatch与CyclicBarrier同步辅助类的艺术

在本文中,我们探讨了Java并发编程中的一些核心概念,包括关键字、volatile关键字以及和同步辅助类。这些工具和机制对于构建可靠和高效的并发应用程序至关重要。作为Java开发者,理解和掌握这些概念,将有助于我们在多线程环境中设计和实现更加安全和高效的程序。

码农超哥的博客 880

时频分析之短时傅里叶变换(STFT)

本文利用MATLAB自带的spectrogram函数对信号做短时傅里叶变换。首先介绍了短时傅里叶变换(STFT)的背景及意义;其次,对spectrogram函数的用法以及变量的含义做了详细的解释;最后,利用MATLAB编写程序实现了信号的STFT。

总结论文中的算法并给出论文的复现代码 7万+

ADS基础教程24 - Gerber文件的导入

一、引言二、基本概念1.仿真文件下载2.仿真文件介绍二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题四、总结选择。通过本文章结束,可以了解ADS中如何将导入Gerber文件,并且对导入的铜皮进行合并。下一步就针对导入的文件进行层叠设置和编辑。END!}}END!

XZ_ZC的博客 3057

JMM内存可见性与顺序一致性模型

首先让我们从as-if-serial语义讲起,程序执行时为提高性能,编译器和处理器常常会对指令做重排序,该语义是指不管怎么重排序,单线程程序的执行结果不能被改变。根据该语义存在数据依赖关系的操作不会发生重排序,因为这种重排序会改变程序的执行结果,部分存在控制依赖关系的操作可以做重排序。编译器和处理器中为了实现as-if-serial语义,定义了一系列的重排序规则,并通过内存屏障指令实现。 内存屏

进一步有一步的欢喜 3525

ABAP CDS View 从入门到精通教程目录:ABAP CDS View 在 SAP 技术体系中的重要地位

学习 ABAP CDS View 的开发技术,体会其背后的设计理念,也就掌握了 SAP S/4HANA 底层数据模型的设计精髓。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4785

Java并发编程9——CountDownLatch / CyclicBarrier / Semaphore

1. CountDownLatch 倒计时锁 1.1 介绍与用法 用来进行线程同步协作,让一个线程等待其他所有线程完成倒计时后再恢复运行(在其之前一般都使用join(),但是join()针对单个不够灵活) 用法:需要被恢复的线程执行await(),其他线程执行完后countDown(); public static void main(String[] args){ //创建 CountDownLatch latch = new CountDownLatch(2);

qq_41157876的博客 299

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java并发编程第9讲——CountDownLatch、CyclicBarrier和Semaphore(万字详解)

在JDK的并发包(JUC)里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Samaphore工具类提供了一种并发流程控制的手段,这同样也是面试和工作中的一个重要知识点,本文将从它们的定义、常用方法、代码示例及核心源码的分析等几个要点详细介绍一下。

让~学习~成为一种习惯(橡 皮 人の技术博客) 2877

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java9 coutdown_Java并发编程 -- Concurrent包源码分析9 -- Semaphore与CountDownLatch

在前面分析ReentrantLock/ReentrantReadWriteLock的时候,我们已经对AQS进行过分析。在初步了解了AQS之后,本篇试图对其进行一个更为系统性的分析。因为AQS是为整个同步框架的基石,不光是锁,很多其他同步组件,比如Semaphore, CountDownLatch,也都是建立在AQS之上。-AQS–同步框架的基石-AQS的3个核心技术原理–AQS源码解析–AQS独占...

weixin_32080327的博客 120

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java并发编程三大神器之CountDownLatch

1、CountDownLatch是什么 2、官网应用demo 2.1、CountDownLatch 官网demo1 2.2、CountDownLatch 官网demo2 3、开发中的应用小栗子 3.1、栗子1:【多个线程等待】模拟并发,让并发线程一起执行 3.2、栗子2:【单个线程等待】多个线程(任务)完成后,进行汇总合并 4、CountDownLatch 实现原理 5、CountDownLatch 结语

michael_linux的博客,一个小小小学生。滴水穿石,步步为营,只为那刹那芳华。 1240

【Java 并发编程】CountDownLatch 简介

I CountDownLatch 概念 II CountDownLatch 使用流程 III CountDownLatch API 简介

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 837

【转】-Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore 该博客转载自​**Matrix海 子​的​Java并发编程:CountDownLatch、CyclicBarrier和Semaphore** 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。   以下是本文目录大纲:   一.CountDownLatch用法   二.C

booleandev 790

Java并发编程八CountDownLatch、CyclicBarrier、Semaphore和Exchanger

并发工具类CountDownLatch Java并发编程一:并发基础必知 Java并发编程二:Java中线程 Java并发编程三:volatile使用 Java并发编程四:synchronized和lock Java并发编程五:Atomic原子类 Java并发编程六:并发队列 CountDownLatch 在日常开发中会遇见这样的场景,在主线程开启多个子线程,并且主线程等待子线程运行完毕在进行汇总...

不正经开发的博客 1920

Java并发编程:CountDownLatch原理与最佳实践

在当今的软件开发领域,高并发编程已成为一项至关重要的技能。特别是在处理大量用户请求或进行大规模数据处理时,如何有效地管理并发任务,确保系统稳定运行,成为开发者面临的一大挑战。Java作为一种广泛应用于企业级应用开发的语言,提供了丰富的并发编程工具和类库。其中,CountDownLatch类便是其中之一。想象一下,在一个复杂的分布式系统中,多个线程需要按照特定的顺序执行任务。例如,一个在线购物平台在处理订单时,可能需要先检查库存,然后更新库存信息,最后生成订单。

我是Java程序员廖志伟,感谢朋友们的支持! 985

java并发编程之CountDownLatch与CyclicBarrier

CountDownLatch和CyclicBarrier是jdk concurrent包下非常有用的两个并发工具类,它们提供了一种控制并发流程的手段。本文将会提供一些应用场景,结合源码,对它们的具体实现以及如何使用做一个具体分析。CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。CountDownLatch使用案例需求:解析一个文件下多个txt文件数据,

u010185262的博客 6285

Java并发编程——CountDownLatch和CyclicBarrier

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

scorpio的博客 416

java并发编程之CountDownLatch

CountDownLatch是一个同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。CountDownLatch概念是很常见的面试问题,在Java并发,所以一定要充分理解它。在这篇文章中,我将介绍与java并发中的CountDownLatch相关的以下几点。 这篇文章中的章节: 什么是CountDownLatch? CountDownLatch如何工作? 实时应用中可...

javaZhong的博客 2207

Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发之AQS详解 CountDownLatch CountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程。 我们首先来看看怎么实现一个线程等待多个线程吧...

kaven 1356

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

原文地址:https://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程工具类,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。 一. CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行.

数据工匠记 3959
上一篇: Java并发编程(8)-Semaphore
下一篇: Java并发编程(10)-显式锁和读写锁
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值