java并发之同步工具类三之栅栏Barrier

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

栅栏跟闭锁是有同样的功能的,都可以让所有线程都阻塞在同一个位置。唯一不同的是,闭锁等待的是事件,而栅栏等待的是一起执行的其他线程。
在之前的博客中 java并发之同步工具类一之闭锁Latch引用了一个赛跑案例,运动员相当于多个并发的子线程,而裁判就是主线程。运动员的就绪等待的是裁判起跑枪指令(即一个事件),当起跑枪发射所有运动员就同时开始跑。这是闭锁的实现方式,而栅栏不同,它没有裁判这个角色,它是观察并等待所有一起跑的运动员都准备就绪后开始跑。这种场景显示中可能会更常见,如几个好朋友约定3点半在广州图书馆门口相见,到了3点半如果有一人没到,其他人就一起等待。这种场景,就是没有裁判这个角色的,等待不是一个事件,而是所有朋友。
栅栏还有个不同,如果其中有一个线程超时或者中止,所有线程都将会终止并抛出BrokenBarrierException,因为没有事件指令,只能通过其他线程共同来维护,一个线程不能就绪其他也就都失败。而这个,就能确保了其他线程也都全部完成了上面的步骤。
我们依旧使用原来的跑步案例,更改起跑限制为栅栏,实现如下


import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;

/**
 *
 * @author Jerry 自由比赛与CycleBarrier
 * @date 2017/12/24 0024
 */
public class SelfMatch {
    public static void main(String[] args) {
        int joinMatchCnt = 5;//参加比赛的人数
        CyclicBarrier beginMatchFlag = new CyclicBarrier(joinMatchCnt);
        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();//所有运动员都到指定位置就绪
        }
        try {
            finishFlag.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("比赛结束.....");
    }

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

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

        @Override
        public void run() {

                try {
                    beginMatchFlag.await();//等待所有队员就绪完毕
                    try {
                        running();
                    } finally {
                        System.out.println("运动员" + name + "跑到终点线");
                        finishFlag.countDown();//运动员跑到终点,这里要放在finally中,如运动员跑步受伤,立即终止个人成绩
                    }

                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                } 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号已就位
运动员5号开始比赛
运动员4号开始比赛
运动员3号开始比赛
运动员2号开始比赛
运动员1号开始比赛
运动员4号跑到终点线
运动员5号跑到终点线
运动员2号跑到终点线
运动员1号跑到终点线
运动员3号跑到终点线
比赛结束.....
VulnHub系列之BadStore_123渗透测试 BADSTORE: 1.2.3 早期网商系统漏洞鉴赏(2004) 阅读详情

相关推荐

VMware虚拟机安装MS-DOS 7.10教程

dos安装教程dos版本7.10附下载链接。

Minecraft_xiaole的博客 1万+

Java并发工具之CyclicBarrier

一、简介 摘自《Java并发编程的艺术》一书中 CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。 CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,

weixin_41951205的博客 2338

四参数与七参数坐标转换含义及区别

一.前言 不同坐标系,其椭球体的长半径,短半径和扁率是不同的。比如我们常用的四种坐标系北京54、西安80、WGS84、CGCS2000所对应的椭球体,它们的椭球体参数就各不相同。而不同空间直角坐标系之间的转换一般通过七参数或者四参数来实现坐标转换。 二.四参数转换 两个不同的二维平面直角坐标系之间转换通常使用四参数模型,四参数适合小范围测区的空间坐标转换,相对于七参数转换的优势在于只需要2个公共已知点就能进行转换,操作简单。 在该模型中有四个未知参数,即: (1)两个坐标平...

尘海折柳的博客 1万+

循环栅栏 CycleBarrier 理解到深入

介绍 CycleBarrier,从一个例子开始理解,然后深入源码分析对应的实现

Wayfreem的博客 2660

服务器测试之GPU基础汇总

GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。一个专门的图形核心处理器。GPU是显示卡的“大脑”,决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。可以形象的理解为90%的ALU(运算单元),5%的Control(控制单元)、5%的Cache(缓存单元)GPU的设计原理——总结为大量的简单运算。

qq_41897488的博客 2万+

基于OpenCV的驾驶疲劳检测与预警系统设计

PERCLOS(Percentage of Eye Closure)是一种基于眼睑闭合程度的疲劳度量指标。在基于OpenCV的驾驶疲劳检测与预警系统设计中,PERCLOS可以用于检测驾驶员的眼睑闭合程度,以判断其是否疲劳。该函数用于检测视频流中人脸的疲劳程度。具体地,该函数通过检测人脸的眼睛和嘴巴的状态来评估人脸的疲劳程度。眼睛状态是通过计算眼睛的长宽比(eyear)来判断,如果长宽比小于某个阈值,则认为眼睛闭合,表示人处于疲劳状态。

2301_79810943的博客 2327

详解Java多线程之循环栅栏技术CyclicBarrier

CyclicBarrier主要用于协调多个线程,确保它们在继续执行之前在某个公共点同步。重用性:一个CyclicBarrier可以被重复使用,这对于那些分阶段执行的多线程任务非常有用。异常处理:正确处理和对于构建健壮的并发应用至关重要。与其他工具的结合:CyclicBarrier可以与Java的其他并发工具,如ExecutorService,配合使用,以处理更复杂的并发场景。学习并发编程是一个持续的过程。技术总是在发展,新的挑战总是在出现。

宋小黑的博客 2075

分区补光与ISP图像调节技术

在安防监控场景中,逆光、强光、明暗不均(如门口 / 窗边的 “阴阳脸” 画面)是导致图像细节丢失的核心问题。分区补光技术通过对画面不同亮度区域精准补光,解决 “局部过曝 / 欠曝” 难题;ISP(图像信号处理器)图像调节技术则通过算法优化,提升画面色彩、对比度与细节。二者协同可实现 “硬件补光 + 算法优化” 的双重增强,是低功耗摄像机实现高清画质的关键技术组合。分区补光与 ISP 图像调节技术:原理、协同方案及安防监控应用案例。一、核心技术原理解析。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 730

Java多线程:回环屏障CyclicBarrier的使用(八)

CyclicBarrier(回环屏障),阻塞一组线程,直至某个状态之后再全部同时执行,并且所有线程都被释放。和之前说的CountdownLatch功能相反,CountdownLatch阻塞主线程,等所有子线程完结了再继续下去。 上节介绍的CountDownLatch在解决多个线程同步方面相对于调用线程的join方法已经有了不少优化,但是CountDownLatch的计数器是一次性的,也就是等到计数器值变为0后,再调用CountDownIatch的await和countdown方法都

weixin_46204877的博客 883

Zemax与Matlab交互:双胶合优化详细流程

Zemax与Matlab交互:双胶合优化详细流程

weixin_72050316的博客 629

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 617

JAVA同步器CyclicBarrier

CyclicBarrier(循环屏障)是 Java 并发包中用于 多线程协同 的工具类,允许多个线程相互等待,直到所有线程都到达某个屏障点(Barrier)后,再继续执行后续任务。其核心特点是 可重复使用,与 CountDownLatch 的一次性特性形成对比。

xiaowangbadan0_0的博客 1178

Open3D 使用RANSAC分割平面【2026最新版】

使用RANSAC从点云中分割平面,用segement_plane函数。博客长期更新,本文最新更新时间为:2026年2月28日。

点云侠的博客 37万+

Java并发学习之同步工具类

一.同步工具类概述 1.什么是同步工具类? 同步工具类可以是任何一个对象,只要他可以根据其自身的状态来协调线程的控制流。 例如: 阻塞队列可以作为同步工具类,还有其它的同步工具类:信号量(Semaphore),栅栏(Barrier),闭锁(Latch)。 在java类库中还包括一些其他的同步工具类,如果这些类无法满足我们的需求,我们可以通过某种机制创建自己的同步工具类。 2.同步工具类的结构化属性: 1)它们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待。 2)它们还提供了一些方法可以

c1776167012的博客 334

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

yangnan0110的专栏 733

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java并发编程-同步工具类

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

a1158375969的专栏 223

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

小鱼的专栏 3万+

Zookeeper之分布式栅栏-Barrier

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

weixin_34227447的博客 641

08.073-cyclic barrier 循环 栅栏

是一个强大的工具,用于协调多个线程在特定时刻同步执行,尤其适用于多线程并行任务需要等待其他线程完成某个阶段后才继续执行的场景。它不仅可以用于基本的线程同步,还可以提供额外的回调功能,增加其灵活性。循环栅栏 是 倒计次数门栓 的补充和 CountDownLatch都是用于多线程同步的工具类,但它们各自的设计和使用场景有所不同,CyclicBarrier可以看作是 CountDownLatch的补充,适用于不同的需求。

qq_41577703的博客 1060

CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏

  同步工具类可以是任何一个对象。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore)、栅栏(Barrier)、以及闭锁(Latch)。   所有的同步工具类都包含一些特定的结构化属性:它们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待,此外还提供了一些方法对状态进行操作,以及另一些方法用于高效地等待同步工具类进入到预期状态。 1....

weixin_30872499的博客 264

java同步工具类使用Demo

一、概念 同步工具类:封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待,此处还提供了一些方法对状态进行操作,以及另一些方法对于高效地等待同步工具类进入到预期状态。包括:闭锁、Future、信号量、栅栏 1、闭锁:在闭锁达到结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当达到结束状态时,这扇门会打开并允许所有的线程通过。CountDownLatch可以使一个或多个...

猴子哥哥的博客 496

java barrier_Java - Latch和Barrier的区别

之所以把Latch与Barrier放在一起比较是因为他们给人一种相似的感觉。他们都是阻塞一些行为直至某个事件发生,但Latch是等待某个事件发生,而Barrier是等待线程。先比较一下JCIP中对二者的描述:LatchA latch is a synchronizer that can delay the progress of threads until it reaches its termi...

weixin_39928461的博客 230

java barrier latch_Java - Latch和Barrier的区别

之所以把Latch与Barrier放在一起比较是因为他们给人一种相似的感觉。他们都是阻塞一些行为直至某个事件发生,但Latch是等待某个事件发生,而Barrier是等待线程。先比较一下JCIP中对二者的描述:LatchA latch is a synchronizer that can delay the progress of threads until it reaches its termi...

weixin_33883104的博客 286

mysql数据库锁 栅栏,线程同步工具类之栅栏

栅栏它能阻止一些线程直到某件事情发生或完成。闭锁也可以来同时启动一组线程来执行相关操作,或者等待一组相关操作执行完。但是闭锁是一次性的,一旦进入状态就不能被重置。栅栏(Barrier)类似于闭锁,闭锁用于等待事件,而栅栏用于等待其它线程,栅栏与闭锁的区别在于,所有线程必须同时到达栅栏的位置,才能继续执行。下面是一个例子,例如进行一个比较大的耗时计算,将其分割成8个公式,计算时间分别为1,2,3,4...

weixin_32539505的博客 182

Java - Latch和Barrier的区别

之所以把Latch与Barrier放在一起比较是因为他们给人一种相似的感觉。 他们都是阻塞一些行为直至某个事件发生,但Latch是等待某个事件发生,而Barrier是等待线程。 先比较一下JCIP中对二者的描述: Latch A latch is a synchronizer that can delay the progress of threads ...

aozhangping6851的博客 203

java barrier_详解java中的同步工具类CyclicBarrier

之前介绍了java中另一个同步工具类CountDownLatch,这篇文章主要介绍CyclicBarrier。一、概念理解CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。就比如说我们在打王者的时候,十个人必须全部加载到100%,才可以开局。否则只要有一个人没有加载到...

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值