简介

  • 栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。

  • CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。

概念解释

  • 屏障

指定数量的线程全部调用 cyclicBarrier的await()方法时,这些线程不再阻塞
  • 循环

通过reset()方法可以进行重置

初始化屏障方式

  • 方式一

public CyclicBarrier(int parties)
  • 方式二

 public CyclicBarrier(int parties, Runnable barrierAction)设置屏障打开前首先运行的线程即该线程的执行时机是在到达屏障之后再执行

典型案例

CyclicBarrier-循环屏障-模拟多线程计算

需求

1、初始化50000条数据
2、通过5个线程并行处理 每一个线程分别处理10000条数据(通过线程池中的5个线程处理)
3、然后将5个线程分别的处理结果汇总(通过初始化栅栏的时候第二个构造函数定义的那个线程处理即Runnable barrierAction)

代码实现及过程分析

形象解释

方法介绍

是否被破坏

isBroken()默认为true状态被改变的场景:1.等待线程被interrupt
2.等待线程timeout
3、其他线程调用reset(),将其重置为true

获取开启屏障的方数

barrier.getParties()

获取正在等待的线程数

barrier.getNumberWaiting()

向栅栏”报道“

  • await()

形象的理解:每有一个线程达到栅栏,就会向栅栏报道,等到齐了指定人数,栅栏就会打开,让这些数量的线程通过该状态被终止的场景:
1.屏障打开
2.本线程被interrupt
3.其他等待线程被interrupted
4.其他等待线程timeout
5.其他线程调用reset()
  • await(timeout,TimeUnit)

该状态被终止的场景:1.屏障打开(返回true)
2.本线程被interrupt
3.本线程timeout
4.其他等待线程被interrupted
5.其他等待线程timeout
6.其他线程调用reset()

重置

reset()将CyclicBarrier回归初始状态,如果有正在等待的线程,则会抛出BrokenBarrierException异常

比较

CyclicBarrier 线程相互等待 可以重置count
CountDownLatch 当前线程等待一个或多个线程 count=0,不可重置

源码分析

核心源码

await方法

同时,Generation描述着CyclicBarrier的更新换代。在CyclicBarrier中,同一批线程属于同一代。当有parties个线程到达barrier之后,generation就会被更新换代。其中broken标识该当前CyclicBarrier是否已经处于中断状态。

默认barrier是没有损坏的。当barrier损坏了或者有一个线程中断了,则通过breakBarrier()来终止所有的线程

源码核心技术点

ReentrantLock

这里先简单介绍下和synchronized区别 下一节再详细的说下(1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock也是独占锁,加锁和解锁的过程需要手动进行,不易操作,但非常灵活。(2)synchronized可重入,因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock也可重入,但加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁。(3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断。(4)ReentrantLock还可以实现公平锁机制 通俗的理解就是谁排队时间最长谁先执行获取锁

代码资源

https://gitee.com/pingfanrenbiji/myconcurrent/blob/master/src/main/java/pers/hanchao/concurrent/eg15/CyclicBarrierDemo.java

参考文章

https://blog.csdn.net/qq_38293564/article/details/80558157
https://baijiahao.baidu.com/s?id=1648624077736116382&wfr=spider&for=pc

本文使用 mdnice 排版

同步工具类CyclicBarrier原理及使用相关推荐

  1. 深入理解同步工具类,看这篇就够了

    大家好,我是陶朱公Boy. 今天跟大家分享一个并发编程领域中的一个知识点--同步工具类. 我将结合一个真实线上案例作为背景来展开讲解这一知识点.给大家讲清楚什么是同步工具类.适合的场景.解决了什么问题 ...

  2. 14、详解java同步工具类CountDownLatch

    这篇文章主要讲解java中一个比较常用的同步工具类CountDownLatch,不管是在工作还是面试中都比较常见.我们将通过案例来进行讲解分析. 一.定义 CountDownLatch的作用很简单,就 ...

  3. Java并发中常用同步工具类

    为什么80%的码农都做不了架构师?>>>    同步工具类可以是任何一个对象,只要它根据其自身的状态来协调线程控制流.阻塞队列(BlockingQueue)可以作为同步工具类,其他类 ...

  4. Java 并发编程之同步工具类闭锁 CountDownLatch

    Java 同步工具类CountDownLatch相当于一个计数器,假设一个方法,等待一个计数器从初始值5变为0,每使用一次countdown()方法,计数器的值减少1,当计数器的值为0时,触发某件事. ...

  5. 深入分析同步工具类之AbstractQueuedSynchronizer

    概览: AQS(简称)依赖内部维护的一个FIFO(先进先出)队列,可以很好的实现阻塞.同步:volatile修饰的属性state,哪个线程先改变这个状态值,那么这个线程就获得了优先权,可以做任何事(当 ...

  6. JAVA同步工具类——CountDownLatch

    闭锁 在学习CountDownLatch之前,让我们先了解一下闭锁的概念. 闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态:闭锁的作用相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭 ...

  7. java并发基础(二)--- Java监视器模型、并发容器、同步工具类(闭锁、信号量)

    原blog链接:http://www.cnblogs.com/peterxiao/p/6921903.html 总结一下第4.5章的东西. 一.java监视器模式 概念:把对象的所有可变状态都封装起来 ...

  8. Java高并发编程:同步工具类

    内容摘要 这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量.用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障, ...

  9. java semaphore 等待时间_一个java同步工具类Semaphore的详解

    Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了.这篇文章将对Semaphore的概念和使用进行一个详解. 一.概念理解 官方是这样 ...

最新文章

  1. 6个用于文本分类的最新开源预训练模型(NLP必备)
  2. python列表可以删除和修改吗_Python列表常见操作详解(获取,增加,删除,修改,排序等)...
  3. 太极计算机长沙,他设计了湖南最有尊严的建筑,诗意得让你想在里面加班
  4. MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)
  5. 信息学奥赛 数论专题 2、带 余 除 法
  6. 网上看到的,关于测试用例编写粒度准则
  7. 2.04 对字母数字的混合排序
  8. c语言 单片机模拟,【51单片机】普通I/O口模拟SPI口C语言程序
  9. Xilisoft DVD to iPhone Converter使用教程
  10. kuangbin 基础DP1
  11. 本地HTML打不开 总打开360页面,彻底解决IE浏览器打不开网页时自动跳转到hao.360.cn导航页的问题-网络教程与技术 -亦是美网络...
  12. linux下的open file是什么,linux修改open files数
  13. STM32 USB DFU功能
  14. apache实验报告 linux_Apache服务器配置实验报告
  15. MATLAB2016笔记(七):数据分析
  16. idea 提示 TKK 更新TKK失败,请检查网络连接,解决办法!
  17. CSP201609-3炉石传说
  18. 洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
  19. 中忻嘉业:因抖音ccr指标异常的惩罚
  20. 机器学习(1)——决策树

热门文章

  1. python办公自动化博客_最全总结 | 聊聊 Python 办公自动化之 Word(下)
  2. 用matlab绘制P三曲线,知道曲线方程 怎么用matlab绘制三维图 一定要给出程序 , matlab怎样画三维曲线...
  3. shell的建立与执行实验报告_实验七 Shell脚本运行的优化
  4. python读取图像并相加_python给图像加上mask,并提取mask区域实例
  5. BUAA_OO_第二单元
  6. 被除数、除数、商、余数的正负号规律二
  7. 修改oracle重做日志文件大小
  8. 基于Cmail的邮件收发限制说明
  9. Leetcode Math刷题笔记
  10. 自动化运维-Ansible (第三部:Playbook 介绍)