java并发编程 CyclicBarrier详解

文章目录

  • 1. CyclicBarrier是什么
  • 2 核心属性详解
  • 3 核心方法详解
    • 3.1 await()
    • 3.1 breakBarrier()
  • 4 总结


java 并发编程系列文章目录

1. CyclicBarrier是什么

在java的类注释上描述:一种同步辅助工具,允许一组线程都等待对方到达一个共同的障碍点。CyclicBarrier在涉及固定大小的线程组的程序中很有用,这些线程偶尔必须相互等待。屏障被称为循环的(Cyclic),因为它可以在等待线程释放后重新使用。

CyclicBarrier支持一个可选的Runnable命令,该命令在参与方中的最后一个线程到达之后,但在释放任何线程之前,每个屏障点运行一次。此屏障操作有助于在任何一方继续之前更新共享状态。
在这里插入图片描述
注:最后一个到达的线程负责执行runnable
示例在java的类注释中已经提供,可以复制粘贴运行看下

2 核心属性详解

	private static class Generation {boolean broken = false;}//线程同步使用的锁private final ReentrantLock lock = new ReentrantLock();//等待的条件队列private final Condition trip = lock.newCondition();//线程同步等待的个数private final int parties;//全部达到点的执行的runnable任务private final Runnable barrierCommand;//标识private Generation generation = new Generation();//统计的数量字段private int count;

3 核心方法详解

3.1 await()

    public int await() throws InterruptedException, BrokenBarrierException {try {return dowait(false, 0L);} catch (TimeoutException toe) {throw new Error(toe); // cannot happen}}//timed 是否是具有超时时间的阻塞,nanos超时时间private int dowait(boolean timed, long nanos)throws InterruptedException, BrokenBarrierException,TimeoutException {final ReentrantLock lock = this.lock;//先获取到锁lock.lock();try {final Generation g = generation;//如果当前g.broken == true 会抛出异常,这个变成true是栅栏被破坏,什么是破坏,下面可//以看到,执行逻辑下面会看到 //总结下:如果有线程被中断和runnable出现异常和超时时间已经到达没有和其他线程一起唤醒的会破坏这个栅栏if (g.broken)throw new BrokenBarrierException();//破坏条件1 线程被中断if (Thread.interrupted()) {breakBarrier();throw new InterruptedException();}//初始状态下count = parties;此时一个线程await 就减-1int index = --count;//最后一个线程await count == 0成立 会执行Runnable 执行完成。//会nextGeneration 就是唤醒所有的线程 重置count 和generationif (index == 0) {  // trippedboolean ranAction = false;try {final Runnable command = barrierCommand;if (command != null)command.run();ranAction = true;nextGeneration();return 0;} finally {//破坏条件2 runable抛出异常 会执行breakBarrierif (!ranAction)breakBarrier();}}//此时是count != 0for (;;) {try {//如果不带超时时间的 直接await等待 带超时时间的 等待nanos时间if (!timed)trip.await();else if (nanos > 0L)nanos = trip.awaitNanos(nanos);} catch (InterruptedException ie) {//破坏条件3 如果等待的过程中线程被中断 执行 breakBarrierif (g == generation && ! g.broken) {breakBarrier();throw ie;} else {Thread.currentThread().interrupt();}}//如果一些线程正常await() 但是有一个线程执行了breakBarrier 此时唤醒线程//g.broken = true  所以其他线程被唤醒也会抛出该异常if (g.broken)throw new BrokenBarrierException();if (g != generation)return index;//破坏条件4 如果传入的nanos <= 0 会直接执行breakBarrier,一般在await(long //timeout, TimeUnit unit)里防止传入小于0if (timed && nanos <= 0L) {breakBarrier();throw new TimeoutException();}}} finally {lock.unlock();}}    

3.1 breakBarrier()

    private void breakBarrier() {//broken =true 让其他线程直接抛出异常generation.broken = true;//恢复count count = parties;//唤醒所有线程trip.signalAll();}

4 总结

CyclicBarrier在执行过程中有一个线程如果出现破坏栅栏情况,之后的其他线程的await方法都会抛出异常,CyclicBarrier可以平替CountDownLatch使用,CountDownLatch是使用AQS的公平锁实现,CyclicBarrier使用可重入锁ReentrantLock 实现,且可以支持一个runnable运行。可以通过合适的场景选用合适的类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/130757.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python开发之个微机器人的二次开发

简要描述&#xff1a; 添加标签 请求URL&#xff1a; http://域名地址/addContactLabel 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明…

快解析内网穿透如何帮你轻松实现外网远程连接?

外网相信大家多少了解一点&#xff0c;其实就是连接不同地区局域网&#xff0c;或者是城域网计算机通信的远程网&#xff0c;因此被称为广域网或者公网。在这个互联网信息时代&#xff0c;很多用户还是不知道怎么连接外网&#xff1f;外网远程桌面连接的步骤是怎样的&#xff1…

普罗米修斯(Prometheus)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、普罗米修斯&#xff08;Prometheus&#xff09;是什么&#xff1f;1.下载Prometheus工具&#xff08;切记和操作系统版本对应&#xff09;2.解压命令3.修改prom…

Prometheus+Grafana 搭建应用监控系统

一、背景 完善的监控系统可以提高应用的可用性和可靠性&#xff0c;在提供更优质服务的前提下&#xff0c;降低运维的投入和工作量&#xff0c;为用户带来更多的商业利益和客户体验。下面就带大家彻底搞懂监控系统&#xff0c;使用Prometheus Grafana搭建完整的应用监控系统。 …

WebGL 同时使用多幅纹理

目录 前言 ​编辑 示例代码 颜色矢量的分量乘法来计算两个纹素最终的片元颜色 注册事件响应函数&#xff1a;loadTexture&#xff08;&#xff09;&#xff0c;最后一个参数是纹理单元编号。 请求浏览器加载图像&#xff1a; 配置纹理&#xff1a;loadTexture&#xff0…

MyBatis中至关重要的关系映射----全方面介绍

目录 一 对于映射的概念 1.1 三种关系映射 1.2 resultType与resultMap的区别 resultType&#xff1a; resultMap&#xff1a; 二&#xff0c;一对一关联查询 2.1 嵌套结果集编写 2.2 案例演示 三&#xff0c;一对多关联查询 3.1 嵌套结果集编写 3.3 案例演示 四&…

SpringBoot + Prometheus + Grafana 打造可视化监控

SpringBoot Prometheus Grafana 打造可视化监控 文章目录 SpringBoot Prometheus Grafana 打造可视化监控常见的监控组件搭配安装Prometheus安装Grafana搭建SpringBoot项目引入依赖示例:监控SpringBoot内置Tomcat线程池的情况grafana创建监控看板 后台SpringBoot服务添加自…

【IBMMQ】搭建测试队列

一、安装IBMMQ 网上有教程&#xff0c;可以学习 我用的IBMMQ7.5&#xff0c;安装教程 二、创建测试队列 进入工作台&#xff1a; 右击队列管理器&#xff0c;新建队列管理器 写队列管理器名称 点击下一步 点击下一步 点击下一步 端口默认为1414&#xff0c;建议换一个 注…

多线程快速入门

线程与进程区别 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合&#xff0c;或者是程序的特殊段&#xff0c;它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程&#xff0c;它负责在单个程序里…

Linux之查看so/bin依赖(三十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【Redis】3、Redis主从复制、哨兵、集群

Redis主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器…

linux————ansible

一、认识自动化运维 自动化运维: 将日常IT运维中大量的重复性工作&#xff0c;小到简单的日常检查、配置变更和软件安装&#xff0c;大到整个变更流程的组织调度&#xff0c;由过去的手工执行转为自动化操作&#xff0c;从而减少乃至消除运维中的延迟&#xff0c;实现“零延时”…

时序预测 | MATLAB实现ELM极限学习机时间序列预测未来

时序预测 | MATLAB实现ELM极限学习机时间序列预测未来 目录 时序预测 | MATLAB实现ELM极限学习机时间序列预测未来预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现ELM极限学习机时间序列预测未来&#xff1b; 2.运行环境Matlab2018及以上&#xff0c;data为数…

【Redis专题】RedisCluster集群运维与核心原理剖析

目录 课程内容一、Redis集群架构模型二、Redis集群架构搭建&#xff08;单机搭建&#xff09;2.1 在服务器下新建各个节点的配置存放目录2.2 修改配置&#xff08;以redis-8001.conf为例&#xff09; 三、Java代码实战四、Redis集群原理分析4.1 槽位定位算法4.2 跳转重定位4.3 …

Ansible数组同步至Shell脚本数组中

1、ansible中定义数组&#xff0c;我以 ccaPojectList 数组为例子,如下图数组内容 2、需要写一个j2模板的Shell脚本&#xff0c;在j2模板的Shell脚本中引用ansible的 ccaPojectList 数组&#xff0c;大致如下图&#xff1a; {% for item in ccaPojectList %} "{{ item }…

探索程序员需要掌握的算法?

文章目录 一&#xff1a;引言二&#xff1a;常见算法介绍三&#xff1a;重点算法总结 &#x1f389;欢迎来到数据结构学习专栏~探索程序员需要掌握的算法&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章…

【漏洞库】Fastjson_1.2.47_rce

文章目录 漏洞描述漏洞编号漏洞评级影响版本漏洞复现- 利用工具- 漏洞环境- 漏洞扫描- 漏洞验证- 深度利用- GetShell- EXP 编写 漏洞挖掘- 寻找入口点- 指纹信息 修复建议- 漏洞修复 漏洞原理 漏洞描述 Fastjson是阿里巴巴公司开源的一款json解析器&#xff0c;其性能优越&am…

TCP服务器使用多路复用

启用复用的作用&#xff1f; 解决linux系统中的io阻塞问题&#xff0c;让多个阻塞io接口可以一起执行。无需开启线程&#xff0c;节省系统资源。 linux系统中的阻塞io有哪些&#xff1f; scanf、read管道、eadTcp套接字、acppet接收连接请求 有以下两种方式实现多路复用&am…

单位固定资产应该怎么管理

对于单位固定资产的管理&#xff0c;更是需要我们以创新的方式&#xff0c;以科技的手段&#xff0c;以严谨的态度来对待。那么&#xff0c;单位固定资产应该如何进行有效的管理呢&#xff1f; 建立一个完善的资产管理系统  我们需要建立一个完善的资产管理系统。这个系统应…

JS如何判断一个变量是否为数组类型?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Array.isArray() 方法⭐ 使用 instanceof 操作符⭐ 使用 Object.prototype.toString.call() 方法⭐ 使用 Array.from() 方法⭐ 使用 Array.prototype.isArray 属性&#xff08;不推荐&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之…