2019独角兽企业重金招聘Python工程师标准>>>

CyclicBarrier当计数减少到0时,会唤醒所有阻塞在同一个Condition上的线程,与CountDownLatch不同的是所有的线程必须同时被唤醒,就好比钓鱼比赛,所有人必须同时开始抛竿一样。CountDownLatch只要求主线程的动作在其他依赖的线程执行完之后执行就OK

测试代码:

package com.jv.parallel.feature;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/** 处理同一个动作有多个线程同时执行的场景*/
public class TestCyclicBarrier {public static void main(String[] args) {//1.得到一个CyclicBarrier实例CyclicBarrier cb = new CyclicBarrier(4);new Thread(new Fishing(cb),"1").start();new Thread(new Fishing(cb),"2").start();new Thread(new Fishing(cb),"3").start();new Thread(new Fishing(cb),"4").start();}static class Fishing implements Runnable{CyclicBarrier cb;public Fishing(CyclicBarrier cb) {this.cb = cb;}@Overridepublic void run() {try {cb.await();System.out.println("第(" + Thread.currentThread().getName() + ")个人开始钓鱼");} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}}
}

原理

这里没有使用到什么设计模式,CyclicBarrier.await方法调用CyclicBarrier.dowait方法,每次调用await方法都会使计数器-1,当减少到0时就会唤醒所有的线程

    public int await() throws InterruptedException, BrokenBarrierException {try {return dowait(false, 0L);} catch (TimeoutException toe) {throw new Error(toe); // cannot happen}}
    public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException {return dowait(true, unit.toNanos(timeout));}
    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) {  // trippedboolean ranAction = false;try {final Runnable command = barrierCommand;if (command != null)command.run();ranAction = true;nextGeneration();return 0;} finally {if (!ranAction)breakBarrier();}}// loop until tripped, broken, interrupted, or timed outfor (;;) {try {if (!timed)trip.await();else if (nanos > 0L)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) {breakBarrier();throw new TimeoutException();}}} finally {lock.unlock();}}

最核心的部分就是

每次调用await方法都会使内部的计数器临时变量-1,当减少到0时,就会调用nextGeneration方法

    private void nextGeneration() {// signal completion of last generationtrip.signalAll();// set up next generationcount = parties;generation = new Generation();}

在这里唤醒所有阻塞的线程

提醒:在声明CyclicBarrier的时候还可以传一个Runnable的实现类,当计数器减少到0时,会执行该实现类

转载于:https://my.oschina.net/u/3049601/blog/1808546

CyclicBarrier使用与原理相关推荐

  1. CyclicBarrier 使用核心原理 图解

    疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...

  2. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  3. java线程同步barrier_Java多线程同步工具类之CyclicBarrier

    一.CyclicBarrier使用 CyclicBarrier从字面上可以直接理解为线程运行的屏障,它可以让一组线程执行到一个共同的屏障点时被阻塞,直到最后一个线程执行到指定位置,你设置的执行线程就会 ...

  4. Java Synchronized 重量级锁原理深入剖析上(互斥篇)

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  5. java基础流程分析,及原理解析,因为bu满,而qian行

    基本功 =>同样的流程 别人的解释*=>基础二 面向对象的特征 四个基本特征:抽象,继承, 封装, 多态 抽象: 就好比用程序描述一个人,肯定得抽象的通过(身高,体重,年龄 , 胖瘦)这些 ...

  6. java并发学习03---CountDownLatch 和 CyclicBarrier

    CountDownLatch,顾名思义就是一个倒计时器.(其实Latch的意思是门闩,这个词的本意是不断的计数减一,减到0了就打开门闩放行,但通常我们还是叫它倒计时器) 这个倒计时器和我们传统意义上的 ...

  7. 最新Java面试题答案

    JAVA基础 JAVA中的几种基本类型,各占用多少字节? 下图单位是bit,非字节 1B=8bit String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类 ...

  8. java 面试题汇总

    文章转自与:https://blog.csdn.net/weixin_38399962/article/details/80358168 JAVA基础 JAVA中的几种基本类型,各占用多少字节?   ...

  9. java服务器访问接口提示network error_北京JAVA开发三年,拿到美团35K的offer面试心得...

    前言 长文干货提示,文章为大家完整记录了一位在北京做了3年的JAVA开发的朋友,如何通过美团的面试及拿到35K的offer.全篇内容由全程电话录音再手打腾稿,原创手打不易,请记得三连支持! 文章末尾有 ...

最新文章

  1. Linux命令:文本处理工具awk详解
  2. ElasticSearch Java Api(三) -更新索引库
  3. 比起VR高端设备市场,三星或对移动VR平台更感兴趣
  4. 存储--盘古_阿里云飞天分布式存储系统设计深度解析
  5. OpenGL中的着色模式GL_SMOOTH与GL_FLAT
  6. centos 安装 MatConvNet (gpu)
  7. 一位前BAT面试官详谈进入BAT面试经验
  8. 夜读丨72名研究生被清退:孩子,你前半生偷的懒,后半生得拼命还
  9. linux查看cpu占用率_Linux 性能查看
  10. es6(var,let,const,set,map,Array.from())
  11. 计算机网络知识点总结(第一章 概述)
  12. Spring Boot 项目启动的七种方式
  13. Eslint的坑和常见报错
  14. 用树莓派实现宽带多次拨号,带宽叠加
  15. 中国NPP净初级生产力数据/植被覆盖空间分布数据分享(2000-2021)
  16. java特性菜鸟_Java attack - Java 特性
  17. 同账号下阿里云ecs克隆——通过镜像更换系统
  18. Git、Github和GitLab的区别及与SVN的比较
  19. mysql8.013安装_关于mysql 8.0.13zip包安装
  20. Java 分割字符串---按字节长度分割带有中文字符串

热门文章

  1. virtualbox在装centos5.6时自协把virtualbox add-on 装上了
  2. 用“组策略”修改注册表十大个经典范例
  3. XGBoost输出特征重要性以及筛选特征
  4. 免费的文本分析 文本挖掘软件工具
  5. Java基础--二维数组
  6. nyoj n-1位数
  7. Android Doze模式源码分析
  8. 对文本框只允许输入数字
  9. XML 学习 (3)
  10. 《LeetCode力扣练习》剑指 Offer 05. 替换空格 Java