CyclicBarrier使用与原理
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使用与原理相关推荐
- CyclicBarrier 使用核心原理 图解
疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 面试必备 + 面试必备 [博客园总入口 ] 疯狂创客圈 经典图书 : <Sprin ...
- Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...
- java线程同步barrier_Java多线程同步工具类之CyclicBarrier
一.CyclicBarrier使用 CyclicBarrier从字面上可以直接理解为线程运行的屏障,它可以让一组线程执行到一个共同的屏障点时被阻塞,直到最后一个线程执行到指定位置,你设置的执行线程就会 ...
- Java Synchronized 重量级锁原理深入剖析上(互斥篇)
前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...
- java基础流程分析,及原理解析,因为bu满,而qian行
基本功 =>同样的流程 别人的解释*=>基础二 面向对象的特征 四个基本特征:抽象,继承, 封装, 多态 抽象: 就好比用程序描述一个人,肯定得抽象的通过(身高,体重,年龄 , 胖瘦)这些 ...
- java并发学习03---CountDownLatch 和 CyclicBarrier
CountDownLatch,顾名思义就是一个倒计时器.(其实Latch的意思是门闩,这个词的本意是不断的计数减一,减到0了就打开门闩放行,但通常我们还是叫它倒计时器) 这个倒计时器和我们传统意义上的 ...
- 最新Java面试题答案
JAVA基础 JAVA中的几种基本类型,各占用多少字节? 下图单位是bit,非字节 1B=8bit String能被继承吗?为什么? 不可以,因为String类有final修饰符,而final修饰的类 ...
- java 面试题汇总
文章转自与:https://blog.csdn.net/weixin_38399962/article/details/80358168 JAVA基础 JAVA中的几种基本类型,各占用多少字节? ...
- java服务器访问接口提示network error_北京JAVA开发三年,拿到美团35K的offer面试心得...
前言 长文干货提示,文章为大家完整记录了一位在北京做了3年的JAVA开发的朋友,如何通过美团的面试及拿到35K的offer.全篇内容由全程电话录音再手打腾稿,原创手打不易,请记得三连支持! 文章末尾有 ...
最新文章
- Linux命令:文本处理工具awk详解
- ElasticSearch Java Api(三) -更新索引库
- 比起VR高端设备市场,三星或对移动VR平台更感兴趣
- 存储--盘古_阿里云飞天分布式存储系统设计深度解析
- OpenGL中的着色模式GL_SMOOTH与GL_FLAT
- centos 安装 MatConvNet (gpu)
- 一位前BAT面试官详谈进入BAT面试经验
- 夜读丨72名研究生被清退:孩子,你前半生偷的懒,后半生得拼命还
- linux查看cpu占用率_Linux 性能查看
- es6(var,let,const,set,map,Array.from())
- 计算机网络知识点总结(第一章 概述)
- Spring Boot 项目启动的七种方式
- Eslint的坑和常见报错
- 用树莓派实现宽带多次拨号,带宽叠加
- 中国NPP净初级生产力数据/植被覆盖空间分布数据分享(2000-2021)
- java特性菜鸟_Java attack - Java 特性
- 同账号下阿里云ecs克隆——通过镜像更换系统
- Git、Github和GitLab的区别及与SVN的比较
- mysql8.013安装_关于mysql 8.0.13zip包安装
- Java 分割字符串---按字节长度分割带有中文字符串