iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中的CyclicBarrier源码分析
  • 380
分享到

Java中的CyclicBarrier源码分析

2023-06-30 01:06:01 380人浏览 泡泡鱼
摘要

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

这篇文章主要介绍了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源码分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Java中的CyclicBarrier源码分析

    本文链接: https://www.lsjlt.com/news/327041.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

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

    下载Word文档
    猜你喜欢
    • Java中的CyclicBarrier源码分析
      这篇文章主要介绍了Java中的CyclicBarrier源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的CyclicBarrier源码分析文章都会有所收获,下面我们一起来看看吧。CyclicB...
      99+
      2023-06-30
    • 【JAVA】CyclicBarrier源码解析以及示例
      文章目录 前言CyclicBarrier源码解析以及示例主要成员变量核心方法 应用场景任务分解与合并应用示例 并行计算应用示例 游戏开发应用示例输出结果 数据加载应用示例 并发工具的协...
      99+
      2023-12-22
      java 开发语言 jvm
    • java 中Buffer源码的分析
      java 中Buffer源码的分析BufferBuffer的类图如下:除了Boolean,其他基本数据类型都有对应的Buffer,但是只有ByteBuffer才能和Channel交互。只有ByteBuffer才能产生Direct的buffe...
      99+
      2023-05-31
      java buffer源码 buf
    • Java ConcurrentHashMap源码分析
      这篇“Java ConcurrentHashMap源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java&...
      99+
      2023-07-05
    • java中CopyOnWriteArrayList源码的示例分析
      这篇文章将为大家详细讲解有关java中CopyOnWriteArrayList源码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。简介CopyOnWriteArrayList是ArrayList的...
      99+
      2023-06-29
    • Java中Handler源码的示例分析
      这篇文章主要介绍了Java中Handler源码的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。从很早开始就认识到 Handler 了,只不过那时修为尚浅,了解的不够深...
      99+
      2023-06-02
    • java 中RandomAccess接口源码分析
      java 中RandomAccess接口源码分析RandomAccess是一个接口,位于java.util包中。这个接口的作用注释写的很清楚了:public interface RandomAccess {}...
      99+
      2023-05-31
      java randomaccess ava
    • Java源码分析:Guava之不可变集合ImmutableMap的源码分析
      目录一、案例场景二、ImmutableMap源码分析总结一、案例场景 遇到过这样的场景,在定义一个static修饰的Map时,使用了大量的put()方法赋值,就类似这样—— pu...
      99+
      2022-11-12
    • Java源码ConcurrentHashMap的示例分析
      小编给大家分享一下Java源码ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、记录形式打算直接把过程写在源码中,会按序进行注释,查阅的时候可以按序号只看注释部分二、Concur...
      99+
      2023-06-15
    • Java ConcurrentHashMap的源码分析详解
      目录概述ForwardingNode节点TreeNodeTreeBinSizeCtl初始化初始化流程查找插入扩容红黑树的读&写读操作写操作小结容器计数总结概述 Concurr...
      99+
      2023-03-02
      Java ConcurrentHashMap源码 Java ConcurrentHashMap
    • Java并发LinkedBlockingQueue源码分析
      目录简介常量构造方法putawaitisOnSyncQueuesignal简介 LinkedBlockingQueue是一个阻塞的有界队列,底层是通过一个个的Node节点形成的链表...
      99+
      2023-02-12
      Java并发LinkedBlockingQueue Java LinkedBlockingQueue
    • Java HashMap使用源码分析
      这篇文章主要讲解了“Java HashMap使用源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java HashMap使用源码分析”吧!0. 成员变量首先我们先看...
      99+
      2023-07-06
    • Java Log框架源码分析
      这篇文章主要讲解了“Java Log框架源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Log框架源码分析”吧!Log4J、Log4J2和LogBack的...
      99+
      2023-07-05
    • 源码分析Java中ThreadPoolExecutor的底层原理
      目录一、根据代码查看jdk提供的3种线程池创建二、3种方式源码分析1、Executors.newCachedThreadPool()2、Executors.newFixedThrea...
      99+
      2023-05-19
      Java ThreadPoolExecutor原理 Java ThreadPoolExecutor
    • Java源码解析之ConcurrentHashMap的示例分析
      小编给大家分享一下Java源码解析之ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!早期 ConcurrentHashMap,其实现是基于:分离锁,也就是将内部进行分段(Segme...
      99+
      2023-06-15
    • Java定时器Timer的源码分析
      目录一、TimerTask1. 任务状态2. 任务属性说明3. 任务方法说明二、Timer1. sched方法2. cancel方法3. purge方法三、TaskQueue四、Ti...
      99+
      2022-11-13
      Java Timer源码 Java Timer定时器 Java Timer
    • Java CopyOnWriteArrayList源码超详细分析
      目录一、概述二、类图三、核心方法1.add()2.set()3.remove()4.get()5.size()四、总结一、概述 CopyOnWriteArrayList是基于写时复制...
      99+
      2022-11-13
      Java CopyOnWriteArrayList Java CopyOnWriteArrayList源码
    • JDK1.8中的ConcurrentHashMap源码分析
       一、容器初始化 1、源码分析 在jdk8的ConcurrentHashMap中一共有5个构造方法,这四个构造方法中都没有对内部的数组做初始化, 只是对一些变量的初始值做...
      99+
      2022-11-12
    • Python中的jieba源码分析
      本篇内容主要讲解“Python中的jieba源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的jieba源码分析”吧!前言jieba分词是Python 里面几个比较流行的中文...
      99+
      2023-06-02
    • Java SpringBoot核心源码的示例分析
      本篇文章给大家分享的是有关Java SpringBoot核心源码的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。SpringBoot源码主线分析我们要分析一个...
      99+
      2023-06-22
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作