文章目录

  • J.U.C脑图
  • CyclicBarrier
  • CyclicBarrier的应用场景
  • 示例
    • await
    • await(long timeout, TimeUnit unit)
    • CyclicBarrier(int parties, Runnable barrierAction)
  • CyclicBarrier和CountDownLatch的区别
  • 代码

J.U.C脑图



CyclicBarrier

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。

当某个线程调用了await方法之后,就会进入等待状态,并将计数器-1,直到所有线程调用await方法使计数器为0,才可以继续执行,由于计数器可以重复使用,所以我们又叫它循环屏障。

CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。


CyclicBarrier的应用场景

CyclicBarrier可以用于多线程计算数据,最后合并计算结果的应用场景


示例

await

输出:


await(long timeout, TimeUnit unit)

为了防止await无限阻塞进程,我们可以设置await的超时时间


运行日志:


CyclicBarrier(int parties, Runnable barrierAction)

CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties,Runnable barrierAction),用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务场景

输出:


CyclicBarrier和CountDownLatch的区别

  • CountDownLatch的计数器只能使用一次。而CyclicBarrier的计数器可以使用reset()方法重置。所以CyclicBarrier能处理更为复杂的业务场景,比如如果计算发生错误,可以重置计数器,并让线程们重新执行一次。

  • CountDownLatch主要用于实现一个或n个线程需要等待其他线程完成某项操作之后,才能继续往下执行,描述的是一个或n个线程等待其他线程的关系,而CyclicBarrier是多个线程相互等待,知道满足条件以后再一起往下执行。描述的是多个线程相互等待的场景

  • CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获得CyclicBarrier阻塞的线程数量。isBroken方法用来知道阻塞的线程是否被中断。


代码

https://github.com/yangshangwei/ConcurrencyMaster

并发编程-18AQS同步组件之 CyclicBarrier 同步屏障相关推荐

  1. Java同步组件之CyclicBarrier,ReentrantLock

    文章目录 Java同步组件概况 `CyclicBarrier`介绍 与`CountDownLatch`比较 相同点 不同点 `CountDownLatch`和`CyclicBarrier`的场景比较 ...

  2. Java7并发编程指南——第二章:线程同步基础

    Java7并发编程指南--第二章:线程同步基础 @(并发和IO流) Java7并发编程指南第二章线程同步基础 思维导图 项目代码 思维导图 项目代码 GitHub:Java7ConcurrencyCo ...

  3. Java并发编程进阶——多线程的安全与同步

    多线程的安全与同步 多线程的操作原则 多线程 AVO 原则 A:即 Atomic,原子性操作原则.对基本数据类型变量的读和写是保证原子性的,要么都成功,要么都失败,这些操作不可中断. V:即 vola ...

  4. 并发编程 | Netty - [常用组件概要]

    INDEX Bootstrap & ServerBootstrap Channel Future & ChannelFuture Selector ChannelHandler Pip ...

  5. Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解

    1. 闭锁:CountDownLatch 1.1 使用场景 若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁. 1.2 代码实现 // 初始化闭锁,并设 ...

  6. Java高并发编程:定时器、互斥、同步通信技术

    笔记摘要 这里分析了多线程的一些细节问题,并介绍了传统定时器的创建,同时实现了根据自己的调度计划的自定义定时器,对于传统互斥技术中发现的内部类问题,进行了分析,最后对于同步通信技术,是重点,分析了如何 ...

  7. Java 多线程和并发编程:(二)线程同步 Lock 锁

    线程同步 Lock 锁 1.Lock 锁 2.步骤 3.Lock 与 synchronized 的区别 1.Lock 锁 Lock 锁:对需要上锁的地方上锁 JDK1.5 后新增的功能 与 Synch ...

  8. 【Java并发编程实战14】构建自定义同步工具(Building-Custom-Synchronizers)

    JDK包含许多存在状态依赖的类,例如FutureTask.Semaphore和BlockingQueue,他们的一些操作都有前提条件,例如非空.任务已完成等. 创建状态依赖类的最简单的房就是在JDK提 ...

  9. Java并发编程系列学习_CountDownLatch倒计时器CyclicBarrier循环栅栏

    一.倒计时器CountDownLatch 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方 ...

最新文章

  1. 取没有date的邮件发送时间
  2. Delphi Android下包含第三方DEX
  3. JAVA语言基础-面向对象(方法重写概述及其应用)
  4. Pytorch-OpCounter: Pytorch平台计算模型#Parameters和FLOPS的工具包
  5. python 判断某个字符是否为中文
  6. 检测相机视野中的物体运动并用Mask显示
  7. 中国地图3D立体效果
  8. 以前的java游戏平台_手机游戏平台java游戏经典的五款游戏回顾!
  9. PxCook安装文件有问题处理办法
  10. 4-20mA电流光纤中继器的原理和应用
  11. 消息队列返回错误:Resource temporarily unavailable
  12. 双旦七大行业营销活动方案
  13. 【bWAPP】XSS通关记录
  14. 解决Ubuntu18.04下VMware开启虚拟网络编辑器无反应
  15. 动态gif图是什么?如何快速制作动态gif?
  16. 【转】Subsonic的添加和更新、删除操作
  17. Windows 文件共享
  18. 系统启动时显示“NTLDR is missing”而无法进入系统的解决方法
  19. enfp工具箱怎么用_5个很少人知道的黑科技工具箱,功能奇妙,一个顶十个用
  20. 灵声科技获数千万元 A 轮融资,由北极光创投投资...

热门文章

  1. risc-v 操作系统教程
  2. 【加速实践】番外篇:numbajit
  3. CMake的几种Include
  4. 目标检测 nms非极大抑制算法
  5. sklearn.naive_bayes
  6. python发展前景怎么样-python发展前景怎么样
  7. 16. Leetcode 845. 数组中的最长山脉 (数组-同向双指针-快慢指针)
  8. ESIM (Enhanced LSTM for Natural Language Inference)
  9. windows10上为jupyter notebook切换指定conda环境
  10. R语言应用实战-聚类分析以及k-means的优缺点