使用场景:

多个线程相互等待,直到都满足条件之后,才能执行后续的操作。CyclicBarrier描述的是各个线程之间相互等待的关系。

使用步骤:

  1. 正常实例化:CyclicBarrier sCyclicBarrier=new CyclicBarrier(3);
  2. 带runnable的实例化,打破屏障时,优先执行Runnable:CyclicBarrier sCyclicBarrier=new CyclicBarrier(3,new Runnable(){//todo});
  3. await线程:sCyclicBarrier.await();
  4. 当wait线程数量为,count值时。唤醒所有等待线程。

原理:这里直接用源码解释(后续补充)

  1. 锁用的是ReentrantLock重入锁。ReentrantLock lock = new ReentrantLock()
  2. 获取该锁的condition实例。Condition trip = lock.newCondition()
  3. wait线程,用的是Condition.await
  4. signal线程,用的是Condition.signalAll
  5. 两个构造函数,初始化parties值,count值,以及Runnable(唤醒时优先执行runnable)
  6. count值是用来计算线程数的。每有一个线程执行了await方法,--count。直到count==0
  7. await方法,包含了是否超时,以及超时时间
  8. dowait是线程wait的主要逻辑代码。当count==0时执行唤醒操作。不为0时,进入for循环,执行Condition.await。
  9. dowait中的for循环是为了超时操作的逻辑。
  10. 正常跳出for循环是通过dowait方法中的(nextGeneration()重新实例化了gennaration)
  11. breakBarrier() 打破屏障,唤醒所有wait线程
  12. nextGeneration() 更新状态,唤醒所有wait线程
  13. reset()重置状态。里面调用了breakBarrier()和nextGeneration()

Java并发组件二之CyclicBarriar的更多相关文章

  1. Java并发编程二三事

    Java并发编程二三事 转自我的Github 近日重新翻了一下<Java Concurrency in Practice>故以此文记之. 我觉得Java的并发可以从下面三个点去理解: * ...

  2. Java并发(二十二):定时任务ScheduledThreadPoolExecutor

    需要在理解线程池原理的基础上学习定时任务:Java并发(二十一):线程池实现原理 一.先做总结 通过一个简单示例总结: public static void main(String[] args) { ...

  3. 和朱晔一起复习Java并发(二):队列

    和朱晔一起复习Java并发(二):队列 老样子,我们还是从一些例子开始慢慢熟悉各种并发队列.以看小说看故事的心态来学习不会显得那么枯燥而且更容易记忆深刻. 阻塞队列的等待? 阻塞队列最适合做的事情就是 ...

  4. Java并发编程 (二) 并发基础

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.CPU多级缓存-缓存一致性 1.CPU多级缓存 ​ 上图展示的是CPU高级缓存的配置,数据的读取和存 ...

  5. Java并发(二)异步转同步

    目录 前置条件:构造一个异步调用 一.使用wait和notify方法 二.使用条件锁 三.Future 四.使用CountDownLatch 五.使用CyclicBarrier 总结 在Java并发编 ...

  6. 【Java并发编程二】同步容器和并发容器

    一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...

  7. Java并发(二十一):线程池实现原理

    一.总览 线程池类ThreadPoolExecutor的相关类需要先了解: (图片来自:https://javadoop.com/post/java-thread-pool#%E6%80%BB%E8% ...

  8. Java并发(二十):线程本地变量ThreadLocal

    ThreadLocal是一个本地线程副本变量工具类. 主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的 ...

  9. Java并发(二):Java内存模型

    一.硬件内存架构 一个现代计算机通常由两个或者多个CPU.其中一些CPU还有多核.每个CPU在某一时刻运行一个线程是没有问题的.如果你的Java程序是多线程的,在你的Java程序中每个CPU上一个线程 ...

随机推荐

  1. python 画图二(三维图,多轴图)

    import sys reload(sys) sys.setdefaultencoding('utf-8') import matplotlib.pyplot as plt import numpy ...

  2. Asp.net Core使用Quartz.net

    1.介绍:Quartz.Net主要是用来做一些周期性的工作,或者定时工作.比如每天凌晨2点执行某个方法或者调用某个接口. Quartz项目地址:https://github.com/quartz-sc ...

  3. 容器编排系统K8s之PV、PVC、SC资源

    前文我们聊到了k8s中给Pod添加存储卷相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html:今天我们来聊一下持久存储卷相关话题 ...

  4. 聊两句XSS(跨站脚本攻击)

    XSS(跨站脚本攻击),聊两句,五毛的. XSS的危害: 窃取Cookie,盗用用户身份信息 这玩意儿是大多数XSS的目标,也好解决,可以先治个标,直接设置HttpOnly=true ,即不允许客户端 ...

  5. 处理xls文件

    package com.cn.peitest.excel; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...

  6. easyui中权限分配和添加 前后端代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. PHP代码审计05之正则使用不当

    前言 根据红日安全写的文章,学习PHP代码审计的第五节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完题目会用一道CTF的题目和实例来加深巩固.这是之前写的,有兴趣可以去看看 ...

  8. [LeetCode]652. Find Duplicate Subtrees找到重复树

    核心思想是:序列化树 序列化后,用String可以唯一的代表一棵树,其实就是前序遍历改造一下(空节点用符号表示): 一边序列化,一边用哈希表记录有没有重复的,如果有就添加,注意不能重复添加. 重点就是 ...

  9. js实现页面消息滚动效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. springboot中数据库的连接

    mysql5.0 1.#mysql数据库连接 2.spring.datasource.driver-class-name=com.mysql.jdbc.Driver   3.spring.dataso ...