我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中的CyclicBarrier源码分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中的CyclicBarrier源码分析

这篇文章主要介绍了Java中的CyclicBarrier源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的CyclicBarrier源码分析文章都会有所收获,下面我们一起来看看吧。

    CyclicBarrier简介

    对于CountDownLatch,其他线程为游戏玩家,比如英雄联盟,主线程为控制游戏开始的线程。在所有的玩家都准备好之前,主线程是处于等待状态的,也就是游戏不能开始。当所有的玩家准备好之后,下一步的动作实施者为主线程,即开始游戏。

    对于CyclicBarrier,假设有一家公司要全体员工进行团建活动,活动内容为翻越三个障碍物,每一个人翻越障碍物所用的时间是不一样的。但是公司要求所有人在翻越当前障碍物之后再开始翻越下一个障碍物,也就是所有人翻越第一个障碍物之后,才开始翻越第二个,以此类推。类比地,每一个员工都是一个“其他线程”。当所有人都翻越的所有的障碍物之后,程序才结束。而主线程可能早就结束了,这里我们不用管主线程。

    CyclicBarrier源码分析

    类的继承关系

    CyclicBarrier没有显示继承哪个父类或者实现哪个父接口, 所有AQS和重入锁不是通过继承实现的,而是通过组合实现的。

    public class CyclicBarrier {}```  ### 类的内部类CyclicBarrier类存在一个内部类Generation,每一次使用的CycBarrier可以当成Generation的实例,其源代码如下```javaprivate static class Generation {boolean broken = false;}

    说明: Generation类有一个属性broken,用来表示当前屏障是否被损坏。

    类的属性

    public class CyclicBarrier {// 可重入锁private final ReentrantLock lock = new ReentrantLock();// 条件队列private final Condition trip = lock.newCondition();// 参与的线程数量private final int parties;// 由最后一个进入 barrier 的线程执行的操作private final Runnable barrierCommand;// 当前代private Generation generation = new Generation();// 正在等待进入屏障的线程数量private int count;}

    说明: 该属性有一个为ReentrantLock对象,有一个为Condition对象,而Condition对象又是基于AQS的,所以,归根到底,底层还是由AQS提供支持。

    类的构造函数

    CyclicBarrier(int, Runnable)型构造函数

    public CyclicBarrier(int parties, Runnable barrierAction) {// 参与的线程数量小于等于0,抛出异常if (parties <= 0) throw new IllegalArgumentException();// 设置partiesthis.parties = parties;// 设置countthis.count = parties;// 设置barrierCommandthis.barrierCommand = barrierAction;}

    说明: 该构造函数可以指定关联该CyclicBarrier的线程数量,并且可以指定在所有线程都进入屏障后的执行动作,该执行动作由最后一个进行屏障的线程执行。

    CyclicBarrier(int)型构造函数

    public CyclicBarrier(int parties) {// 调用含有两个参数的构造函数this(parties, null);}

    说明: 该构造函数仅仅执行了关联该CyclicBarrier的线程数量,没有设置执行动作。

    核心函数 - dowait函数

    此函数为CyclicBarrier类的核心函数,CyclicBarrier类对外提供的await函数在底层都是调用该了doawait函数,

    其源代码如下:

    private int dowait(boolean timed, long nanos)throws InterruptedException, BrokenBarrierException,TimeoutException {// 保存当前锁final ReentrantLock lock = this.lock;// 锁定lock.lock();try {// 保存当前代final Generation g = generation;if (g.broken) // 屏障被破坏,抛出异常throw new BrokenBarrierException();if (Thread.interrupted()) { // 线程被中断// 损坏当前屏障,并且唤醒所有的线程,只有拥有锁的时候才会调用breakBarrier();// 抛出异常throw new InterruptedException();}// 减少正在等待进入屏障的线程数量int index = --count;if (index == 0) { // 正在等待进入屏障的线程数量为0,所有线程都已经进入// 运行的动作标识boolean ranAction = false;try {// 保存运行动作final Runnable command = barrierCommand;if (command != null) // 动作不为空// 运行command.run();// 设置ranAction状态ranAction = true;// 进入下一代nextGeneration();return 0;} finally {if (!ranAction) // 没有运行的动作// 损坏当前屏障breakBarrier();}}// loop until tripped, broken, interrupted, or timed out// 无限循环for (;;) {try {if (!timed) // 没有设置等待时间// 等待trip.await();else if (nanos > 0L) // 设置了等待时间,并且等待时间大于0// 等待指定时长nanos = trip.awaitNanos(nanos);} catch (InterruptedException ie) {if (g == generation && ! g.broken) { // 等于当前代并且屏障没有被损坏// 损坏当前屏障breakBarrier();// 抛出异常throw ie;} else { // 不等于当前带后者是屏障被损坏// We're about to finish waiting even if we had not// been interrupted, so this interrupt is deemed to// "belong" to subsequent execution.// 中断当前线程Thread.currentThread().interrupt();}}if (g.broken) // 屏障被损坏,抛出异常throw new BrokenBarrierException();if (g != generation) // 不等于当前代// 返回索引return index;if (timed && nanos <= 0L) { // 设置了等待时间,并且等待时间小于0// 损坏屏障breakBarrier();// 抛出异常throw new TimeoutException();}}} finally {// 释放锁lock.unlock();}}

    核心函数 - nextGeneration函数

    此函数在所有线程进入屏障后会被调用,即生成下一个版本,所有线程又可以重新进入到屏障中,

    其源代码如下:

    private void nextGeneration() {// signal completion of last generation// 唤醒所有线程trip.signalAll();// set up next generation// 恢复正在等待进入屏障的线程数量count = parties;// 新生一代generation = new Generation();}

    在此函数中会调用AQS的signalAll方法,即唤醒所有等待线程。如果所有的线程都在等待此条件,则唤醒所有线程。

    其源代码如:

    public final void signalAll() {if (!isHeldExclusively()) // 不被当前线程独占,抛出异常throw new IllegalMonitorStateException();// 保存condition队列头节点Node first = firstWaiter;if (first != null) // 头节点不为空// 唤醒所有等待线程doSignalAll(first);}

    关于“Java中的CyclicBarrier源码分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java中的CyclicBarrier源码分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    Java中的CyclicBarrier源码分析

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    Java中的CyclicBarrier源码分析

    这篇文章主要介绍了Java中的CyclicBarrier源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的CyclicBarrier源码分析文章都会有所收获,下面我们一起来看看吧。CyclicB
    2023-06-30

    【JAVA】CyclicBarrier源码解析以及示例

    文章目录 前言CyclicBarrier源码解析以及示例主要成员变量核心方法 应用场景任务分解与合并应用示例 并行计算应用示例 游戏开发应用示例输出结果 数据加载应用示例 并发工具的协
    【JAVA】CyclicBarrier源码解析以及示例
    2023-12-22

    java 中Buffer源码的分析

    java 中Buffer源码的分析BufferBuffer的类图如下:除了Boolean,其他基本数据类型都有对应的Buffer,但是只有ByteBuffer才能和Channel交互。只有ByteBuffer才能产生Direct的buffe
    2023-05-31

    Java中Handler源码的示例分析

    这篇文章主要介绍了Java中Handler源码的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。从很早开始就认识到 Handler 了,只不过那时修为尚浅,了解的不够深
    2023-06-02

    java中CopyOnWriteArrayList源码的示例分析

    这篇文章将为大家详细讲解有关java中CopyOnWriteArrayList源码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介CopyOnWriteArrayList是ArrayList的
    2023-06-29

    Java ConcurrentHashMap源码分析

    这篇“Java ConcurrentHashMap源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java Concu
    2023-07-05

    java 中RandomAccess接口源码分析

    java 中RandomAccess接口源码分析RandomAccess是一个接口,位于java.util包中。这个接口的作用注释写的很清楚了:/** * Marker interface used by List imp
    2023-05-31

    Java源码ConcurrentHashMap的示例分析

    小编给大家分享一下Java源码ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、记录形式打算直接把过程写在源码中,会按序进行注释,查阅的时候可以按序号只看注释部分二、Concur
    2023-06-15

    Java ConcurrentHashMap的源码分析详解

    ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构,想对于普通的HashMap,CHM提供了线程安全的读写,CHM里面使用了许多比较精妙的优化&操作。本文主要对CHM的整体结构、初始化,查找,插入等做分析
    2023-03-02

    源码分析Java中ThreadPoolExecutor的底层原理

    这篇文章主要带大家从源码分析一下Java中ThreadPoolExecutor的底层原理,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-05-19

    Java Log框架源码分析

    这篇文章主要讲解了“Java Log框架源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Log框架源码分析”吧!Log4J、Log4J2和LogBack的历史故事使用过Log
    2023-07-05

    Java HashMap使用源码分析

    这篇文章主要讲解了“Java HashMap使用源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java HashMap使用源码分析”吧!0. 成员变量首先我们先看一下 HashMap
    2023-07-06

    Java并发LinkedBlockingQueue源码分析

    这篇文章主要为大家介绍了Java并发LinkedBlockingQueue源码分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-12

    Java定时器Timer的源码分析

    通过源码分析,我们可以更深入的了解其底层原理。本文将通过Timer的源码,带大家深入了解Java Timer的使用,感兴趣的小伙伴可以了解一下
    2022-11-13

    Python中的jieba源码分析

    本篇内容主要讲解“Python中的jieba源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的jieba源码分析”吧!前言jieba分词是Python 里面几个比较流行的中文
    2023-06-02

    Java源码解析之ConcurrentHashMap的示例分析

    小编给大家分享一下Java源码解析之ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!早期 ConcurrentHashMap,其实现是基于:分离锁,也就是将内部进行分段(Segme
    2023-06-15

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录