1. package com;
  2.  
  3. import java.util.Map;
  4. import java.util.concurrent.BrokenBarrierException;
  5. import java.util.concurrent.ConcurrentHashMap;
  6. import java.util.concurrent.CyclicBarrier;
  7.  
  8. /**
  9. * Created by yangyu on 16/11/28.
  10. */
  11.  
  12. /**
  13. * CyclicBarrier是一个同步屏障
  14. * CyclicBarrier让一个线程达到屏障时被阻塞,直到最后一个线程达到屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行
  15. * CyclicBarrier(int parties, Runnable barrierAction)构造函数,用于在所有线程都到达屏障后优先执行barrierAction的run()方法
  16. * CyclicBarrier使用场景:
  17. * 可以用于多线程计算以后,最后使用合并计算结果的场景;
  18. *
  19. * 以下列子就是:使用5个线程分别向Map中放置计算好的数据,最后由Action来执行合并结果的功能;
  20. *
  21. * 原理:
  22. * CyclicBarrier中有一个计数器,每当一个线程调用await()方法时计数器就会减1
  23. * 计数器不等于0时,会通过ReentrantLock重入所的condition的await()方法将线程阻塞
  24. * 直到计数器等于0时,会检测是否有barrierAction,如果有则执行barrierAction的run方法,然后唤醒signalAll()所有阻塞线程
  25. * 如果没有barrierAction则直接通过signalAll()唤醒所有阻塞线程
  26. */
  27. public class TestCyclicBarrier {
  28.  
  29. private static ConcurrentHashMap<String,Integer> map = new ConcurrentHashMap<String, Integer>();
  30.  
  31. public static void main(String[] args) {
  32. /**
  33. * CyclicBarrier会阻塞5个线程,当5个线程都到达屏障时会优先执行Action的run()方法
  34. */
  35. CyclicBarrier c = new CyclicBarrier(5,new Action());
  36. for (int i = 0; i < 5; i++) {
  37. new Thread(()->{
  38. /**
  39. * 将计算完成的结果放入Map中
  40. */
  41. map.put(String.valueOf(Thread.currentThread().getId()),5);
  42. try {
  43. /**
  44. * 被屏障拦截
  45. */
  46. c.await();
  47. } catch (InterruptedException e) {
  48. e.printStackTrace();
  49. } catch (BrokenBarrierException e) {
  50. e.printStackTrace();
  51. }
  52. }).start();
  53. }
  54. }
  55.  
  56. /**
  57. * 屏障开启后,优先执行Action的run()方法合并结果
  58. */
  59. private static class Action implements Runnable{
  60.  
  61. @Override
  62. public void run() {
  63. int j=0;
  64. for (Map.Entry<String,Integer> entry : map.entrySet()){
  65. System.out.println(entry.getValue());
  66. j = j+entry.getValue();
  67. }
  68. System.out.println("j="+j);
  69. }
  70. }
  71. }

Java--CyclicBarrier同步屏障原理,使用的更多相关文章

  1. java CyclicBarrier同步屏障

    CyclicBarrier的字面意思是可循环使用的屏障,它的主要作用是,让一组线程到达一个屏障时被阻塞,知道最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续运行. 1.简介: Cyc ...

  2. Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用

      转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html  一:CountDownLatch CountDownLatch是一个执行 完成任务 ...

  3. Java核心-多线程-并发控制器-CyclicBarrier同步屏障

    1.基本概念 中文译本同步屏障,同样来自jdk并发工具包中一个并发控制器,它的使用和CountDownLatch有点相似,能够完成某些相同并发场景,但是它们却不相同. 2.抽象模型 主要用来实现多个线 ...

  4. java多线程--同步屏障CyclicBarrier的使用

    CyclicBarrier的概念理解: CyclicBarrier的字面上的意思是可循环的屏障,是java并发包java.util.concurrent 里的一个同步工具类,在我下载的JDK1.6的中 ...

  5. Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。

    精彩理解:  https://www.jianshu.com/p/21be831e851e ;  https://blog.csdn.net/heyutao007/article/details/19 ...

  6. JUC并发工具类之 CyclicBarrier同步屏障

    首先看看CyclicBarrier的使用场景: 10个工程师一起来公司应聘,招聘方式分为笔试和面试.首先,要等人到齐后,开始笔试:笔试结束之后,再一起参加面试.把10个人看作10个线程,10个线程之间 ...

  7. java 线程同步 原理 sleep和wait区别

    java线程同步的原理java会为每个Object对象分配一个monitor, 当某个对象(实例)的同步方法(synchronized methods)被多个线程调用时,该对象的monitor将负责处 ...

  8. Java多线程同步集合--并发库高级应用

    一.阻塞队列1.在多线程领域,所谓阻塞,在某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒2.ArrayBlockingQueue(效率高)和LinkedBlockingQueue是两个 ...

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

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

随机推荐

  1. paip.python错误解决24

    paip.python错误解决 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax ...

  2. KnockoutJS 3.X API 第五章 高级应用(5) 使用预处理扩展Knockout绑定语法

    注意:这是一种高级技术,通常仅在创建可重用绑定或扩展语法的库时使用. 这不是你通常需要做的时候使用Knockout构建应用程序. 从Knockout 3.0开始,开发人员可以通过提供在绑定过程中重写D ...

  3. :after和:before炫酷用法总结

    引入 提到伪类,在我的印象中最常用的不过是:hover.:active.:link.:visited,还有css3里的常用伪类选择器:last-child.:first-child.nth-child ...

  4. SQL Server 2014云特性:无缝集成公有云

    本篇是我在IT168的约稿,原文地址:http://tech.it168.com/a2014/0620/1637/000001637358_all.shtml       IT行业已经进入了云时代,未 ...

  5. Chrome开发者工具之JavaScript内存分析

    阅读目录 对象大小(Object sizes) 对象的占用总内存树 支配对象(Dominators) V8介绍 Chrome 任务管理器 通过DevTools Timeline来定位内存问题 内存回收 ...

  6. linux-redis

    1.下载 6.启动 ./redis-server ../conf/redis.conf 7.测试 ./redis-cli -p 7030 set str "hello" ./red ...

  7. 如何安装Oracle Instant Client

    Oracle Instant Client是Oracle发布的轻量级数据库客户端,下面我们来看看官方的定义: Instant Client allows you to run your applica ...

  8. 浅谈A/B测试里常见的辛普森悖论,企业决策者必看

    A/B测试背后有着高深的统计学知识,今天我们就来讲讲常见的辛普森悖论. 辛普森悖论 (Simpson's Paradox) 是英国统计学家 E.H.辛普森 (E.H.Simpson) 于1951年提出 ...

  9. Deep learning:四十二(Denoise Autoencoder简单理解)

    前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...

  10. Zip文件中文乱码问题解决方法(MAC->Windows)

    前言: 最近收到的ZIP交互原型,打开查看中文一堆乱码.主要是产品都是高大上啊,用的都是MAC,咱酷毙用的Windows,话说安卓APP,你用MAC搞啥啊.可恨的压缩用的是zip,不是rar之类的.为 ...