Java并发编程(四):CyclicBarrier原理详解

并发编程系列之CountDownLatch对战Cyclicbarrier 前言 前面我们介绍了并发容器和队列,今天我们来介绍几个非常有用的并发工具类,今天主要讲CountDownLatch和Cyclicbarrier这两个工具类,通过讲解并对比两个类的区别,OK,让我们开始今天的并发之旅吧。 什么是CountDownLatch? CountDownLatch用于监听某些初始化操作,等待初始化执行完毕,通知主线程继续工作,允许一个或者多个线程等待其他线程完成操作。之前我们知道要实现线程等待还有一个方法就是jion方法,先让我们来回忆什么是Join方法: Join用于让. 阅读详情

1 引言

少侠在之前的一篇博客介绍闭锁CountDownLatch的时候有提到CyclicBarrier,那么它究竟是什么呢?本篇文章和你们一起揭开它神秘的面纱。
关于CountDownLatch的原理和用法可以阅读下篇,附传送门↓:
Java并发编程(三):CountDownLatch(闭锁)原理及最佳实践
从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。
它的作用就是会让所有线程都等待完成后才会继续下一步行动。

举个例子,就像我们打王者荣耀,每个人的宽带网速不同,游戏开始受限于每个人进入游戏的时机,只有当所有人都进入游戏才会开局,这里的开局就是CyclicBarrier(这里仅仅是举例,并不代表王者荣耀游戏开局就是通过CyclicBarrier实现的)。

2 基本用法

2.1 构造方法:
 public CyclicBarrier(int parties) 
 public CyclicBarrier(int parties, Runnable barrierAction) 

说明:

  • parties表示参与的线程个数
  • 第二个构造方法有个Runnable类型的参数,表示当所有线程都完成后再继续进行的任务。
2.2 常用方法
public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException

说明:

  • 线程调用await()表示自己已经到达栅栏
  • BrokenBarrierException表示栅栏已经被破坏,破坏的原因可能是其中一个线程await()时被中断或者超时
2.3 一个小栗子

假设A、B、C、D、E、F六个人约好了今天去春游,把预约的车子比喻成CyclicBarrier,必须六个人都到了才能开始发车,只要缺一个人,其他先到达的人必须等待。如何实现这个场景呢?
来看代码:

/**
 * @author Carson
 * @date 2020/4/14 19:13
 */
public class Main {
    public static void main(String[] args) {
        int threadNum = 6;
        //初始化循环栅栏,含6个线程,当6个线程都到栅栏位置则执行这里的“集合完毕...”
        final CyclicBarrier cyclicBarrier = new CyclicBarrier(threadNum, new Runnable() {
            @Override
            public void run() {
                System.out.println("\r\n" + Thread.currentThread().getName() + " 集合完毕,准备发车..."+"\r\n");
            }
        });
        //初始化线程池
        final ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(threadNum,
                new BasicThreadFactory.Builder().daemon(true).build());
        for (int i = 0; i < threadNum; i++) {
            //提交线程
            threadPoolExecutor.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " 前来集合...");
                    try {
                        //每次提交的时候调用await()操作,通知系统自己已经到达栅栏处
                        cyclicBarrier.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                    //当所有线程都冲破栅栏之后继续执行该操作
                    System.out.println(Thread.currentThread().getName() + " 开始春游...");
                }
            });
        }
    }
}

输出结果也好理解:

pool-1-thread-3 前来集合...
pool-1-thread-5 前来集合...
pool-1-thread-1 前来集合...
pool-1-thread-4 前来集合...
pool-1-thread-2 前来集合...
pool-1-thread-6 前来集合...

pool-1-thread-6 集合完毕,准备发车...

pool-1-thread-6 开始春游...
pool-1-thread-3 开始春游...
pool-1-thread-2 开始春游...
pool-1-thread-4 开始春游...
pool-1-thread-1 开始春游...
pool-1-thread-5 开始春游...

由结果可以看出,6个人全部到齐的时候才执行集合完毕的操作,并且该操作是由最后一个冲破栅栏的线程执行的(如本例是pool-1-thread-6完成执行的)。当所有人都冲破栅栏之后,于是各个线程都依次执行它们后续的操作。

3 CyclicBarrier与CountDownLatch的区别

  • CyclicBarrier底层的计数器是可以通过reset()方法重置以达到循环使用的目的,而CountDownLatch计数器不可被重置。
  • CyclicBarrier用于等待其他线程运行到栅栏位置(当所有线程都运行到栅栏位置则冲破栅栏),CountDownLatch允许一个或多个线程等待一组事件的发生。
  • 在CyclicBarrier中,所有参与的线程职责是一样的;而CountDownLatch中参与的线程的职责是不一样,有的在倒计时,有的在等待倒计时结束。

点点关注,不会迷路

Java并发编程:CountDownLatch和CyclicBarrier的应用场景 在多线程编程中,我们经常需要让多个线程“配合工作”:有的线程需要等待其他线程完成任务后才能开始,有的需要多个线程“步调一致”地推进阶段任务。和就是专门解决这类问题的工具。本文将聚焦这两个工具的核心原理使用场景和对比分析,覆盖从概念理解到代码实战的完整学习路径。用生活故事引出两个工具的核心思想;结合代码和流程图解释底层原理;通过实际项目案例演示使用方法;对比两者的差异,总结选择策略;给出思考题和常见问题解答。:倒计时门闩,一个线程等待多个线程完成任务(计数器归零后唤醒); 阅读详情

相关推荐

英飞凌AURIX™ Development Studio(ADS)工程调试与烧录实战指南

本文详细介绍了英飞凌AURIX™ Development Studio(ADS)的工程调试与烧录实战指南。从调试环境搭建、硬件连接到断点设置、变量监控等核心调试技巧,帮助开发者快速掌握ADS安装使用教程,提升多核处理器开发效率。

k8l9m0n的博客 574

CyclicBarrier使用与原理

1 CyclicBarrier简介 CyclicBarrier,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。 所谓Cyclic即 循环 的意思,所谓Barrier即 屏障 的意思。 所以综合起来,CyclicBarrier指的就是 循环屏障,虽然这个叫法很奇怪,但是确能很好地表示它的作用。 其作用在JDK注释中是这样描述的: A syn...

深耕技术 4933

CY7C68013 C0模式启动

C0或是C2启动的目的,是更改USB芯片的ID信息,并把固件载入到芯片内部RAM中运行。C0模式是指只从EEPROM中载入USB ID信息,因为只有ID信息(8个字节),所以只需要一个小容量的EEPROM即可。当然大容量的EEPROM也可以使用C0模式,但是小容量的EEPROM只能使用C0模式启动。如下图所示: 使用小容量的EEPROM要将A0,A1,A2接地。 这里我用了个24LC01,容量1

Fezl的博客 1740

一文掌握CyclicBarrier实现原理【建议收藏】

CyclicBarrier(循环屏障)是一个同步工具类,通过CyclicBarrier可以实现一组线程等待至某个屏障点之后再全部同时执行(即:线程之间相互等待)。

专注Java后端技术干货、项目源码总结分享,期待您的关注。 1915

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

qq_36773158的博客 4646

SAP 财务快速记账之--科目分配模型(Account assignment model )

SAP FICO 运维解决方案

lijinbao171022的博客 1768

Java CyclicBarrier原理

1、CyclicBarrier的简单概述 现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。 在JUC包中为我们提供了一个同步工具类能够很好的模拟这类场景,它就是CyclicBarrier类。利用CyclicBarrier类可以实现一组线程相互等待,当所有线程都到达某个屏障点后再进行后续的操作。下图演示了这一过程。 CyclicBarrier字面意思是“可重复使用的栅

xyz的专栏 293

Cadence PSpice 仿真11:电感型低通滤波器最坏情况分析仿真实战图文教程

在进行蒙特卡罗分析时会将元器件的容差考虑进去,然后通过运行多次的随机仿真,得到电路输出的一个范围。但是多数情况下设计师关注的只是电路的最坏情况是否满足设计要求。PSpice的最坏情况分析是取在容差的边界点元件参数进行仿真以计算出电路输出的最坏情况。所以如果如果电路中有10个元件的话,需要先取10个元件的标准值仿真1次,然后再分别在10个元件的容差边界处各仿真1次,然后再对仿真结果进行统计和计算,再最坏情况下再仿真1次。

fydar的博客 1944

java之 CyclicBarrier 原理

JUC回顾之-CyclicBarrier底层实现和原理 http://www.cnblogs.com/200911/p/6060195.html JUC回顾之-CyclicBarrier底层实现和原理 1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门。所有...

qq_35967283的博客 839

Microsemi Libero系列教程(六)——Identify片上逻辑分析仪的使用

文章目录FPGA如何进行在线调试关于Microsemi片上逻辑分析仪FPGA片上逻辑分析仪原理预期效果0.准备一个创建好的Libero工程1.新建identify工程,并添加想要监测的信号2.管脚分配,编译下载3.设置触发类型4.IICE逻辑分析仪核资源占用 系列教程:Microsemi Libero系列教程 FPGA如何进行在线调试 对于嵌入式系统来说,如单片机,进行硬件级程序调试时,通常采用的是JLink/ST-Link调试器,在线调试的方式来获取程序实时运行的状态,可以观察程序运行流程、各种变量的值

whik1194的博客 1万+

YOLO26改进策略【Neck】| ICCV2025 反向卷积 Converse2D 数学逆运算提重构 + 特征域建模降伪影,提升多尺度目标检测精度

本文记录的是利用Converse2D 算子改进 YOLO26 的上采样。(Converse 2D Convolution)通过正则化最小二乘闭式解与深度化空间建模结合,实现YOLO26特征提取与上采样阶段的卷积逆运算及特征精准重构。本文利用算子,通过闭式解的非迭代计算还原卷积下采样后的原始特征,再通过可学习核与自适应正则化参数稳定逆问题求解,同时依托圆形填充与插值初始估计保留特征高频细节,对YOLO26中不同尺度检测目标的特征进行针对性重构强化、抑制卷积/转置卷积带来的伪影与信息损失干扰,在特征融合与上采样

Limiiiing的博客 655

CyclicBarrier 使用&核心原理 图解

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

架构师尼恩 2858

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java并发编程之CyclicBarrier详解

简介栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏...

Stay Hungry, Stay Foolish 6万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

探索并发编程:深入理解 CyclicBarrier 的原理

在多线程编程中,同步是一项关键的任务,尤其是当涉及到多个线程需要在某个共同点上同步执行时。Java 提供了丰富的并发工具来帮助开发人员实现线程之间的同步和协作。其中之一就是 CyclicBarrier(循环栅栏),这是一种非常有用的同步工具,能够让多个线程在某个共同点上同步等待,然后同时继续执行。在本篇博客中,我们将深入探讨 CyclicBarrier 的工作原理、基本用法以及一些常见的应用场景。通过了解 CyclicBarrier,您将能够更好地利用它来优化多线程程序的设计和性能。

weixin_67589420的博客 2056

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java并发编程:CyclicBarrier原理与应用

在当今的软件开发领域,高并发编程已成为一项至关重要的技能。特别是在处理大规模数据或需要高响应速度的应用场景中,如何有效地管理并发任务,确保系统稳定运行,成为开发人员必须面对的挑战。在此背景下,Java并发编程库中的CyclicBarrier类应运而生,它为解决并发编程中的同步问题提供了强大的支持。想象一个在线购物平台,当用户发起一个购物车结算请求时,系统需要同时处理订单生成、库存更新、支付处理等多个并发任务。在这个过程中,各个任务之间需要协同工作,确保数据的一致性和准确性。

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

Java并发编程,CyclicBarrier详解

是Java并发编程中非常有用的工具之一,它可以帮助开发者轻松地协调多个线程之间的执行顺序,特别是在需要循环性任务或多次迭代的情况下。理解的工作原理及其相关的同步工具(如Phaser和Semaphore),可以使我们在编写复杂的并发程序时更加得心应手。需要注意的是,虽然这些工具提供了强大的功能,但正确使用它们对于确保程序的安全性和效率至关重要。

横竖撇折点 1276

JDK 并发编程工具类详解:CountDownLatch、Semaphore、Exchanger、CyclicBarrier 和 Phaser

在 Java 并发编程中,JDK 提供了一些强大的工具类来帮助开发者处理线程间的同步和通信问题。这些工具类主要包括 `CountDownLatch`、`Semaphore`、`Exchanger`、`CyclicBarrier` 和 `Phaser`,它们都位于 `java.util.concurrent` 包下,统称为 JUC(Java Util Concurrent)工具类。本文将详细介绍这些工具类的作用、使用方法和原理。

专注Java和MySQL领域知识分享 1655

并发编程原理与实战(七)详解并发协同利器CyclicBarrier

本文详细讲解了循环屏障CyclicBarrier的主要方法,通过“同时对接口发起多次压测”这个例子,和用CountDownLatch实现对比,说明了循环屏障的使用。

真战 1289

并发编程之循环屏障CyclicBarrier

CyclicBarrier循环屏障是多线程并发编程中的常用同步类,我们可以用它来实现多个线程相互等待,并且可重用。其中的dowait()方式是核心方法,用可重入锁ReentrantLock保证了方法逻辑同步功能,使用Condition的await()、signalAll()方法来阻塞和唤醒线程。

勤于笔记,成于点滴。 841

【Java并发编程】循环屏障CyclicBarrier详解

CyclicBarrier 是一个线程同步工具类,用于协调一组线程,使其在达到某个共同点(屏障)后再一起继续执行。与 CountDownLatch 不同,CyclicBarrier 可以重复使用,每次达到屏障后,都会开启新一代线程,并重置屏障状态。CyclicBarrier 主要通过 ReentrantLock 和 Condition 实现,并提供了 await() 方法用于线程阻塞等待,以及 breakBarrier()、nextGeneration() 和 reset() 等工具方法用于控制屏障状态。

叉烧钵钵鸡的博客 1456

如何理解 Java 并发编程中的 CyclicBarrier 和 ReentrantLock?

是 Java 并发包()中的一个重要类,用于实现显式锁(Explicit Lock)。它提供了比关键字更灵活和更强大的锁机制。在实际开发中,常用于替代关键字,以实现更复杂的同步需求。和是 Java 并发编程中非常重要的工具类。主要用于多个线程在某个固定点上进行同步,常用于并行计算结果的汇总和阶段性同步。提供了比更灵活和强大的锁机制,适用于各种复杂的同步需求,如高度竞争的共享资源访问、实现读写锁、中断响应锁、超时锁获取以及条件变量等功能。

qq_33326733的博客 679
上一篇: 【Java集合】系列二:搞定HashSet(本篇源码基于Java11)
下一篇: 【HTTP】这一次,终于彻底弄清了POST和GET请求的区别
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值