java并发之同步工具类一之闭锁Latch

JUC同步工具类——信号量、闭锁、栅栏、交换器 同步工具类可以使任何一种对象,只要该对象可以根据自身的状态来协调控制线程的控制流。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括:信号量(Semaphore)、栅栏(Barrier)、闭锁(Latch)以及交换器(Exchanger)。 –《Java并发编程实战》 阅读详情

java同步工具类(指jdk1.5版本)主要有闭锁(Latch)、信号灯(semaphore)和栅栏(barrier)。本篇作为开篇,先讲闭锁。闭锁就相当于一扇门,在制定的线程到达后这扇门才打开,后续所有线程可以通过,否则就一直处于阻塞状态。用于确保某些活动(这里可以理解为子线程)都完成后再继续执行下去(主线程)。如游戏中所有玩家就绪后才能点击开始,测试并发代码块真正的执行时间等(当我们在测试多线程的时候,总会有部分线程先启动,部分后启动,毕竟创建线程本身也需要时间,也就是多个线程会处在不同的初始条件下,这样测试出来的执行时间会有偏差,特别是线程非常多的时候,而闭锁可以在先启动的线程会等到所有后面启动的线程都启动完毕后再一起开始)。
如下面的代码引用了一个同样的场景——跑步比赛,只有所有运动员sprotMan都准备就绪后,裁判judge才能执行开始比赛。当所有运动员都结束比赛(到达终点或者放弃比赛),整场比赛才算结束。

import java.util.concurrent.CountDownLatch;

/**
 *
 * @author Jerry 比赛与Latch
 * @date 2017/12/24 0024
 */
public class Judge {
    public static void main(String[] args) {
        int joinMatchCnt = 5;//参加比赛的人数
        CountDownLatch beginMatchFlag = new CountDownLatch(1);
        CountDownLatch finishFlag = new CountDownLatch(joinMatchCnt);
        System.out.println("比赛准备开始.....");
        for (int i = 1; i <= joinMatchCnt; i++) {
            Thread t = new Thread(new Sportsman(beginMatchFlag, finishFlag, i + "号"));
            System.out.println("运动员"+i + "号已就位");
            t.start();//所有运动员都到指定位置就绪
        }
        beginMatchFlag.countDown();//裁判吹哨
        try {
            finishFlag.await();//裁判等待运动员跑完
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("比赛结束.....");
    }

    static class Sportsman implements Runnable {
        private CountDownLatch beginMatchFlag;
        private CountDownLatch finishFlag;
        private String name;

        public Sportsman(CountDownLatch beginMatchFlag, CountDownLatch finishFlag, String name) {
            this.beginMatchFlag = beginMatchFlag;
            this.finishFlag = finishFlag;
            this.name = name;
        }

        @Override
        public void run() {
            try {
                beginMatchFlag.await();//等待裁判比赛开始
                try {
                    running();
                } finally {
                    finishFlag.countDown();//运动员跑到终点,这里要放在finally中,如运动员跑步受伤,立即终止个人成绩
                }
                System.out.println("运动员" + name + "跑到终点线");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

        private void running() {
            try {
                System.out.println("运动员" + name + "开始比赛");
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行的结果如下

比赛准备开始.....
运动员1号已就位
运动员2号已就位
运动员3号已就位
运动员4号已就位
运动员5号已就位
运动员1号开始比赛
运动员2号开始比赛
运动员3号开始比赛
运动员4号开始比赛
运动员5号开始比赛
运动员1号跑到终点线
运动员3号跑到终点线
运动员2号跑到终点线
运动员4号跑到终点线
运动员5号跑到终点线
比赛结束.....
【多线程】门栓/闭锁(Latch/CountDownLatch) 闭锁(CountDownLatch)是一种线程同步工具,通过计数器机制实现线程间协作。核心特点是:初始化时设定计数器值;线程调用countDown()递减计数;调用await()的线程会阻塞直到计数归零。典型应用场景包括服务依赖等待、多线程任务同步等。与CyclicBarrier不同,闭锁是一次性使用的,更强调"事件完成"而非线程相互等待。Java中的CountDownLatch类提供了简洁的实现,适合需要等待多个操作完成的并发控制场景。 阅读详情

相关推荐

华为无线AP+AC(ensp)

VLAN 100--192.168.100.0/24为AP的管理IP地址VLAN10--192.168.10.0/24为无线用户获取的IP地址在DHCP Server(LSW3)上查看地址分配情况。

abcdlalal的博客 1万+

java 锁性能

java锁消耗的性能,主要是多线程先cpu对线程的调度消耗的,在有锁的情况下,cpu要调度某个线程可用,某个线程不可用,这些本来就是要消耗系统资源的。所以个人认为,多线程下性能下降的原因主要是两方便的,第一 锁消耗性能,第二是线程调度消耗性能。以下通过两个方便为别测试。       首先是单线程下,锁消耗的性能:          public class Test {    priva...

xingyuaini的博客 349

内网环境下的高德地图离线化实战:从瓦片下载到交互功能集成

本文详细介绍了在内网环境中部署离线高德地图的完整实战方案。针对军工、能源、金融等对网络隔离与数据安全有严格要求的场景,文章核心解决了离线地图的两大基石:地图瓦片数据的高效下载与本地化,以及高德地图JS API的获取与插件集成。通过具体代码示例,进一步讲解了如何实现地图初始化、海量点标注与聚合、自定义图标及框选查询等核心交互功能,并分享了内网部署的路径配置、性能优化及法律合规等关键注意事项,为开发者在封闭网络环境下构建稳定、可控的地图应用提供了清晰指南。

Apple的专栏 394

Java并发编程学习8-同步工具类

本篇介绍一下Java平台类库下的常用的同步工具类(闭锁、Future、信号量和栅栏)

Huazie 1830

机器学习第五章之决策树模型

机器学习专题系列

wangyutao12345的博客 5183

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

Java多线程之同步工具的类型和区别

一旦一个线程获得了该锁,其他线程就无法访问该对象的同步代码块,直到该线程释放锁。CyclicBarrier维护了一个计数器和一个屏障点,每个线程通过await()方法告知自己已经到达屏障点,计数器递增,直到计数器值达到指定数量时,所有线程同时被释放。倒计时门栓是一种同步工具,可以让一个或多个线程等待,直到其他线程完成一定的操作后才继续执行。在Java多线程编程中,同步工具是一种常见的技术,用于管理线程的同步和互斥。Java提供了许多同步工具,例如锁、信号量、倒计时门栓等。

MRZHQ的博客 386

CAN收发器TJA1145A休眠唤醒应用

TJA1145的唤醒工作原理主要依赖于其内部的唤醒机制和外部硬件的配合,主要涉及低功耗状态、选择性唤醒功能。TJA1145是一款CAN收发器,它支持多种工作模式,包括NormalStandbySleep等。在这些模式中,Sleep模式是最低功耗状态,而Normal模式则是最活跃的状态,其中Standby模式处于两者之间,允许一定的功能操作但功耗较低。TJA1145可以通过接收特定的唤醒源从Sleep或Standby模式唤醒到Standby或Normal模式。唤醒源的检测与处理。

radix关于mcu的博客,持续更新中... 5951

8.3 Latch类

Latch 英文原意,插销 等待锁,是一个同步辅助类 用来同步执行任务的一个或者多个线程(在某一个地方等待) 不是用来保护临界区或者共享资源,是用来协调各个线程,执行到某个地方的时候,大家都暂停一下,大家都到了,在往下执行 CountDownLatch(Latch 主要实现类) countDown() 计数减一 await() 等待latch 变成 0 示例描述:设想百米赛跑比赛 发令枪发出信号后选手开始跑,全部选手跑到终点后比赛结束 startSignal.await(); startSign

Seventeen ten的博客 266

stable diffusioncontrolNet 预处理器/模型的下载及安装使用教程

首先说明,controlNet 的模型 不同于stable diffusion 模型,这一点一定要区分清楚。下面提供多个ControlNet 预处理器+ 专用模型的百度网盘下载链接,都是由群友整理贡献,但各自包含的版本不同,大家可自行选择。推荐下载紫色链接内的模型,fp16版文件更小,稍微新一些的controlnet插件还添加了对control-lora的支持(注意,要求controlnet插件的版本比12月16号新(1.1.423以上)才能正常识别),推荐下载;

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3385

[QMT和ptrade量化交易小白入门]-109、小市值选股的基础上用六脉神剑评分,回测年化可到132%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1863

同步工具类一:闭锁(java.util.concurrent.CountDownLatch)

一,让所有线程同时启动

怀揣梦想,努力前行 6432

基于 STM32 的智慧农业温室控制系统设计与实现

本文提出一种基于 STM32 微控制器的智慧农业温室控制系统设计方案,通过集成多类型环境传感器、执行机构及无线通信模块,实现对温室内温湿度、光照、土壤湿度等参数的实时监测与自动调控。文中详细阐述硬件选型、电路连接及软件实现流程,并附关键代码示例,为智慧农业领域提供低成本、高可靠性的温室控制解决方案。

weixin_42300449的博客 1923

java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

-闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后

小鱼的专栏 3万+

计算机控制技术及应用

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

JAVA并发包中有三个类用于同步一批线程的行为,分别是闭锁(Latch),信号灯(Semaphore)和栅栏(CyclicBarrier)。本贴主要说明闭锁(Latch)和栅栏(CyclicBarrier)。 1. 闭锁(Latch) 闭锁(Latch) —— 确保多个线程在完成各自事务后,才会打开继续执行后面的内容,否则一直等待。 计数器闭锁(CountDownLatch) —— 是JD...

weixin_30520015的博客 231

IEM模型,地表粗糙度模拟

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

Java并发编程 —— 同步工具类-闭锁(CountDownLatch)、信号量(Semaphore)、栅栏(CyclicBarrier)

1. 闭锁(CountDownLatch) 2. 信号量(Semaphore) 3. 栅栏(CyclicBarrier) 前言: 同步工具类可以是任何一对象,他可以根据自身的状态来协调线程的控制流。 同步工具类主要包括 闭锁(如CountDownLatch),栅栏(如CyclicBarrier)信号量(如Semaphore)和阻塞队列(如LinkedBlockingQueue) 1. 闭锁...

debug 1054

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

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

同步工具类--闭锁

闭锁是一种同步工具类,可以延迟线程的进度直到其达到终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达 结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以用来确保某些活动直到其它活动都完成后才继续 执行,例如: 1、确保某个计算在其需要的所有资源都

zjt1388的专栏 778

java latch闭锁基本使用(结合future)

java闭锁用于多个线程共同执行后,统一执行一个动作。比如:多个线程执行计算操作,最后汇总到同一个线程执行汇总计算。需要注意的是,java中的闭锁是仅一次的。当闭锁打开后就会统一执行下面的动作。 下面简单的举一个例子: worker线程进行工作,boss线程等到所有woker工作完成后,检查工作。 思路是这样的,首先使用java中的CountDownLatch,每个worker线程工作完成后...

archer的技术故事 2432

Java并发编程 闭锁Latch

本文整理自《Java并发编程实战》一书。 闭锁(Latch)是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以用来确保某些活动直到其他活动都完成后才继续执行,

枯鸦专栏 1430

并发容器、同步容器、同步工具类

一、同步容器类 1.同步容器类包括Vector和Hashtable。这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法都进行同步,使得每次只有一个线程能够访问容器的状态。 2.同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁来保护符合操作。 3.

yangnan0110的专栏 733

Java并发编程-同步工具类

概述 同步工具类可以是任何一个对象, 只要它根据自身的状态来协调线程的控制流.比如阻塞队列, 信号量, 栅栏以及闭锁等. 这些同步工具类都有一些特定的属性:它们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待, 还提供了一些方法对状态进行操作,以及一些方法用于高效地等待同步工具进入预期状态. 常见的同步工具类 闭锁(Latch) 设计动机: 延迟线程进度直到其达到终止状态, 闭...

a1158375969的专栏 223

【Java并发编程实战】 5.5.1章节 闭锁 CountDownLatch 实现

1. 什么是闭锁 闭锁(latch)是一种 Synchronizer,他可以延迟线程的进度直到线程到达终止状态。 一个闭锁工作起来就像一道大门:直到闭锁达到终点状态之前,门一直是关闭的,没有线程通过,在终点状态到来的时候,门开了,允许所有线程都通过。一旦闭锁到达了终点状态,他就不能够在改变状态了,所以它会永远保持敞开的状态。 2. 闭锁的应用场景 确保一个计算不会执行,直到它需要的资源被初始化。 确保一个服务不会开始,直到它依赖的服务都已经开始。 等待直到活动的所有部分都为继续处理做好准备。比如王者荣耀需

m0_45406092的博客 469

闭锁(Latch)

此小节介绍几个与锁有关的有用工具。 闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的

huangmin2050的专栏 2059

java线程栅栏_Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

JAVA并发包中有三个类用于同步一批线程的行为,分别是闭锁(Latch),信号灯(Semaphore)和栅栏(CyclicBarrier)。本贴主要说明闭锁(Latch)和栅栏(CyclicBarrier)。1. 闭锁(Latch)闭锁(Latch) —— 确保多个线程在完成各自事务后,才会打开继续执行后面的内容,否则一直等待。计数器闭锁(CountDownLatch) —— 是JDK5+ 里面...

weixin_42408094的博客 269
上一篇: java并发之死锁
下一篇: java并发之同步工具类二之信号灯semaphore
@云师兄
博客等级 码龄10年 10粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值