- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章CyclicBarrier:人齐了,老司机就发车了!由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
上一篇咱讲了 CountDownLatch 可以解决多个线程同步的问题,相比于 join 来说它的应用范围更广,不仅可以应用在线程上,还可以应用在线程池上。然而 CountDownLatch 却是一次性的计数器,以王者农药来说,咱们不可能一场团战就决定比赛的输赢,所以在某些场景下,咱们是需要重复使用某个等待功能的,这就是我们今天要介绍的另一个主角——CyclicBarrier.
。
CyclicBarrier 翻译为中文是循环(Cyclic)栅栏(Barrier)的意思,它的大概含义是实现一个可循环利用的屏障.
CyclicBarrier 作用是让一组线程相互等待,当达到一个共同点时,所有之前等待的线程再继续执行,且 CyclicBarrier 功能可重复使用.
举个栗子 。
比如磊哥要坐班车回老家,因为中途不允许上、下乘客,所以营运的公司为了收益最大化,就会等人满之后再发车。像这种等人坐满就发一班车的场景,就是 CyclicBarrier 所擅长的,因为它可以重复使用(不像 CountDownLatch 那样只能用一次).
。
CountDownLatch:一个或者多个线程,等待另外 N 个线程完成某个事情之后才能执行.
CountDownLatch 就像玩王者农药开局的加载一样,所有人要等待其他人都加载 100% 之后才能开始游戏.
CyclicBrrier:N 个线程相互等待,直到有足够数量的线程都到达屏障点之后,之前等待的线程就可以继续执行了.
CyclicBrrier 就像老司机开车一样,如果车上还有空余的座位,那么所有人都得等着,直到座位被坐满之后,老司机才会发车.
。
以上代码执行结果如下:
从上述结果可以看出:当 CyclicBarrier 的计数器设置为 2 时,线程 2 和 线程 3 都到屏障点之后,老司机才会发第一波车,再 2s 之后,线程 1 和线程 4 也同时进入了屏障点,这时候老司机又可以再发一波车了.
。
我们先来看下 CyclicBarrier 的类图:
由上图可知 CyclicBarrier 是基于独占锁 ReentrantLock 实现的,其底层也是基于 AQS 的.
在 CyclicBarrier 类的内部有一个计数器 count,当 count 不为 0 时,每个线程在到达屏障点会先调用 await 方法将自己阻塞,此时计数器会减 1,直到计数器减为 0 的时候,所有因调用 await 方法而被阻塞的线程就会被唤醒继续执行。当 count 计数器变成 0 之后,就会进入下一轮阻塞,此时 parties(parties 是在 new CyclicBarrier(parties) 时设置的值)会将它的值赋值给 count 从而实现复用.
。
CyclicBarrier(parties):初始化相互等待的线程数量的构造方法.
CyclicBarrier(parties,Runnable barrierAction):初始化相互等待的线程数量以及屏障线程的构造方法,当 CyclicBarrier 的计数器变为 0 时,会执行 barrierAction 构造方法.
getParties():获取 CyclicBarrier 打开屏障的线程数量,也称为方数.
getNumberWaiting():获取正在CyclicBarrier上等待的线程数量.
await():在 CyclicBarrier 上进行阻塞等待,直到发生以下情形之一:在 CyclicBarrier 上等待的线程数量达到 parties,则所有线程被释放,继续执行,
await(timeout,TimeUnit):在CyclicBarrier上进行限时的阻塞等待,直到发生以下情形之一:
isBroken():获取是否破损标志位 broken 的值,此值有以下几种情况:
reset():使得CyclicBarrier回归初始状态,直观来看它做了两件事:
。
CyclicBrrier 是通过独占锁 ReentrantLock 实现计数器的原子性更新的,CyclicBrrier 最常用的是 await() 方法,使用此方法会将计数器 -1,并判断当前的计数器是否为 0,如果不为 0 就会阻塞等待,并计时器为 0 之后,才能继续执行剩余任务。CyclicBrrier 相比于 CountDownLatch 来说,它的优势在于可以重复使用.
。
原文地址:https://mp.weixin.qq.com/s/eMpfvq3un7ILz9YlwVRdEA 。
最后此篇关于CyclicBarrier:人齐了,老司机就发车了!的文章就讲到这里了,如果你想了解更多关于CyclicBarrier:人齐了,老司机就发车了!的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
运行以下代码时,2个启动线程将被CyclicBarrier *对象锁定,并无限等待第三个线程解锁 import java.util.concurrent.BrokenBarrierException;
介绍 CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。 就比如说我
一 点睛 1 定义 CyclicBarrier 可以用于解决多个线程之间的相互等待问题。CyclicBarrier 的使用场景是,每个线程在执行时,都会碰到屏障,该屏障会拦截所有线程的执行(通过 aw
我正在尝试使用 CyclicBarrier 模拟铁人三项比赛,但它没有按预期工作,我也不知道为什么。 比赛的每一部分都要等到所有跑者都完成上一部分后,但似乎永远在等待。 这是第一阶段的代码片段: cl
下面的代码似乎不是并行运行的,而是在每个单独的线程上调用 wait() 方法的情况下,在另一个请求之后发出一个请求。有人可以帮助并行调用该线程吗? public class XYZ { priv
我正在实现一个并行算法。如果没有 CyclicBarrier,我可以用一半的顺序时间完成工作。使用 CyclicBarrier 会使时间延长 100 倍。我将包括我的线程调用和线程函数,以便您可以看到
在这种情况下,CyclicBarrier 是否最适合。 我想在 Stages 中并行运行 n 个线程(在 Stages 等待直到所有线程完成该 Stage)。 public class
我想使用 CyclicBarrier 对象作为静态成员,我有多个线程正在运行,它将修改 CyclicBarrier 对象状态,这样做安全吗? 最佳答案 CyclicBarrier 的全部意义在于同步多
我正在尝试通过在启动(等待)几个方(线程)的过程中重置 cyclicbarrier 来测试 BrokenBarrierException,请在下面找到相同的示例代码。 用户类: public clas
我有一个使用 CyclicBarrier 的方法,如下所示: public void getMessage(Message obj){ CyclicBarrier barrier = new
我正在寻找 CyclicBarrier我写了这个演示。 import java.util.concurrent.BrokenBarrierException; import java.util.con
当在 Java 中使用 CyclicBarrier 同步线程时,它们是否同步非 volatile 变量? int a = 0; int b = 0; CyclicBarrier barrier = n
我有一个函数可以将数组分割成更小的部分。 然后在单独的线程中评估每个部分。 结果被填充到一个公共(public)列表中。 private void sortandkeep(int[] arr){
上一篇咱讲了 CountDownLatch 可以解决多个线程同步的问题,相比于 join 来说它的应用范围更广,不仅可以应用在线程上,还可以应用在线程池上。然而 CountDownLatch 却
栅栏类似闭锁,但是它们是有区别的. 1.闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事件,只有该countDown事件执行后所有之前在等待的
我在jdk1.8中分析了代码,但在其他jdk版本中可能有同样的问题 让我们假设以下代码中的partys = 3 CyclicBarrier cb = new CyclicBarrier(3); par
我正在努力实现以下目标: 获取用户的两个输入( length 和 amountOfCycles ) 创建一个包含 length 的数组线程数量。每个包含一个整数 value在 [1, 100] 范围内
对于我的家庭作业,我必须制作一个由几个国王在棋盘上移动的游戏。每个国王必须在自己的线程中从其独特的起始位置移动到独特的结束位置。在采取行动之前,国王必须 hibernate 长达 10 毫秒(有点随机
我知道下面的代码可能看起来很粗俗,但我对这些东西还是陌生的,只是为了让它工作而尝试了一切...... 问题:即使我正在使用(可能以错误的方式)一个 CyclicBarrier,一个 - 并且似乎总是相
在 CyclicBarrier.reset javadocs,以下提到。 Note that resets after a breakage has occurred for other reason
我是一名优秀的程序员,十分优秀!