为什么80%的码农都做不了架构师?>>>   

CountDownLatch和CyclicBarrier的主要联系和区别如下:
1.闭锁CountDownLatch做减计数,而栅栏CyclicBarrier则是加计数。
2.CountDownLatch是一次性的,CyclicBarrier可以重用。
3.CountDownLatch强调一个线程等多个线程完成某件事情。CyclicBarrier是多个线程互等,等大家都完成。
4.鉴于上面的描述,CyclicBarrier在一些场景中可以替代CountDownLatch实现类似的功能。

另外,值得一提的是,CountDownLatch和CyclicBarrier在创建和启动线程时,都没有明确提到同时启动全部线程,事实上这在技术上是不大可能,不必要,不提倡的。

先看例子一:

class SubRunnable implements Runnable {private CountDownLatch begin, end;private List<Integer> sublist;public SubRunnable(List<Integer> sublist, CountDownLatch begin,CountDownLatch end) {this.sublist = sublist;this.begin = begin;this.end = end;}@Overridepublic void run() {try {begin.await();            if (sublist != null) {for (int i : sublist) {System.out.println("线程" + Thread.currentThread().getName() + ", i = " + i);}}} catch (InterruptedException e) {e.printStackTrace();} finally{System.out.println(System.currentTimeMillis() + ",线程" + Thread.currentThread().getName() + ",开始执行!");end.countDown();}}
}
public class BatchWithCountDownLatch {private static final int MAX = 3;private static void list(List<Integer> list) {if(list == null){list = new ArrayList<Integer>();}for(int i = 0 ;i < 1000;i++){list.add(i);}}public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list(list);//把list拆分成多个int mod = list.size() % MAX;int threadCount = mod == 0 ? list.size() / MAX : list.size() / MAX + 1;ExecutorService executors = Executors.newFixedThreadPool(threadCount);CountDownLatch begin = new CountDownLatch(1); CountDownLatch end = new CountDownLatch(threadCount); for(int i = 0; i< threadCount;i++){int subsize = (i + 1) * MAX;executors.execute(new SubRunnable(list.subList(i * MAX, subsize > list.size() ? list.size() : subsize),begin,end));}System.out.println("开始 !");begin.countDown();long startTime = System.currentTimeMillis();try {end.await();} catch (InterruptedException e) {e.printStackTrace();} finally {System.out.println("线程" + Thread.currentThread().getName() + "," + System.currentTimeMillis() + ", 所有线程已完成,开始进入下一步!");System.out.println("花费时间 -> " + (System.currentTimeMillis() - startTime) + " ms");}System.out.println("开始进入第二步操作! ");        System.out.println("end! ");}
}

这是根据jdk文档中的伪代码例程,编写的一个例子,我们完全可以将这个例程改为只使用一个CountDownLatch来实现之。经过测试,发现begin的引入对程序基本无用,当list是1000的数量级时,最先启动的线程仍然比最后启动的快几十毫秒左右;而不设置begin开始闭锁的程序,也是完全一样的情况。

例子二:

class SubRunnable implements Runnable {private CyclicBarrier cyclicBarrier;private List<Integer> sublist;public SubRunnable(List<Integer> sublist, CyclicBarrier cyclicBarrier) {this.sublist = sublist;this.cyclicBarrier = cyclicBarrier;}@Overridepublic void run() {        try {System.out.println(System.currentTimeMillis() + ",线程" + Thread.currentThread().getName() + ",开始执行!");if(sublist != null){for(int i : sublist){System.out.println("线程" + Thread.currentThread().getName() + ", i = " + i);}}cyclicBarrier.await();} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}
}
public class ReplaceCountDownLatch {private static final int MAX = 3;private static void list(List<Integer> list) {if(list == null){list = new ArrayList<Integer>();}for(int i = 0 ;i < 10;i++){list.add(i);}}public static void main(String[] args) throws InterruptedException, BrokenBarrierException {List<Integer> list = new ArrayList<Integer>();list(list);//把list拆分成多个int mod = list.size() % MAX;int threadCount = mod == 0 ? list.size() / MAX : list.size() / MAX + 1;ExecutorService executors = Executors.newFixedThreadPool(threadCount);final CyclicBarrier cyclicBarrier = new CyclicBarrier(threadCount,new Runnable() {@Overridepublic void run() {//根据jdkdoc里的描述,哪个线程最后运行完,就执行下面的代码。System.out.println("线程" + Thread.currentThread().getName() + "," + System.currentTimeMillis() + ", 所有线程已完成,开始进入下一步!");}});for(int i = 0; i< threadCount;i++){int subsize = (i + 1) * MAX;executors.execute(new SubRunnable(list.subList(i * MAX, subsize > list.size() ? list.size() : subsize),cyclicBarrier));}cyclicBarrier.await();executors.shutdown();System.out.println("开始进入第二步操作! ");System.out.println("end! ");}
}

使用栅栏CyclicBarrier实现和上面闭锁CountDownLatch相同的功能。

转载于:https://my.oschina.net/ramboo/blog/421945

闭锁CountDownLatch和栅栏CyclicBarrier之异同举例相关推荐

  1. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...

    信号量semaphore    允许多个线程同时访问 读写锁ReadWriteLock   在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch    obj = new Count ...

  2. java concurrent 栅栏,java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)

    [一:java并发的开篇 1.在实际应用中,经常用到线程的并发,那为什么需要用到并发呢,不能独自单独的程序处理吗,那很明确的说,多条线程做完成一件事情和一条线程去完成 -闭锁(Latch) 闭锁(La ...

  3. Java并发工具类(闭锁CountDownLatch)

    并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...

  4. 非常有用的并发控制-循环栅栏CyclicBarrier

    转载自 非常有用的并发控制-循环栅栏CyclicBarrier 昨天我讲了倒计时器CountDownLatch的应用,它是阻塞线程直到计时器归0的一种等待方式.今天讲的这个循环栅栏CyclicBarr ...

  5. 十三、栅栏CyclicBarrier

    一.简介 栅栏CyclicBarrier的作用就是等待一组线程都准备好了,然后执行某个任务.这与CountDownLatch很相似. 但是CyclicBarrier和CountDownLatch是有区 ...

  6. 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)

    闭锁(Latch) 闭锁(Latch):一种同 步方法,可以延迟线程的进度直到线程到达某个终点状态 .通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都 将通 ...

  7. 循环计数_倒计数器:CountDownLatch | 循环栅栏:CyclicBarrier

    倒计数器:CountDownLatch CountDownLatch 从名字就可以看出其作用:初始化一个计数,然后每次递减,直至为0,然后触发一个动作.只有一个带参构造器: CountDownLatc ...

  8. JAVA 并发编程之三:CountDownLatch(门闩)、CyclicBarrier(栅栏)和Semaphore(信号量) 三种并发策略

    在JDK的并发包中已经提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类中提供了一种并发流程控制的手段,Exchanger工具类提供了在 ...

  9. 信号量(Semaphore)、闭锁(Latch)、栅栏(Barrier)

    目录 1.信号量(Semaphore) 描述 场景 Semaphore 2.闭锁(Latch) 描述 场景 CountDownLatch 3.栅栏(Barrier) 描述 场景 CyclicBarri ...

最新文章

  1. 模拟 CSU 1562 Fun House
  2. Python Split函数的用法总结
  3. 济南长清104国道科目三考试流程(转载)
  4. vuex第三弹vuex之actions(前端网备份)
  5. 小氓男-灰色按钮激活V1.0
  6. P3128 [USACO15DEC]Max Flow P
  7. 第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]
  8. Github | 标星20k+ Facebook 开源高效词表征学习库fastText
  9. 数据仓库中的两大经典模型
  10. AndroidStudio插件GsonFormat快速实现JavaBean
  11. 更改input标签的placeholder的样式
  12. 怎么看计算机的硬盘牌子,硬盘序列号,详细教您怎么查看硬盘序列号
  13. Mac VMWare键盘鼠标失灵
  14. 如何推广自己的新网站
  15. 爱因斯坦:三篇著名演讲
  16. 【魔域口袋版】一键端+一键配置器+架设教程+GM工具
  17. 电网计算机面试专业题,国家电网计算机管理员面试经验|面试题 - 职朋职业圈...
  18. 美通社企业新闻汇总 | 2019.1.18 | 联通与中兴打通全球首个5G智能终端;碧桂园化身产城运营服务商...
  19. C++中sprintf_s与sprintf的不同
  20. 【Linux】Linux下怎么下载安装Chrome?

热门文章

  1. 联想发布首款自研工业机器人,用5G技术给国产大飞机喷漆
  2. 一秒回到P图前:Adobe发布“反向PS”利器,知道你修过哪里,还帮你修回去
  3. PS常用快捷键就这些了,记住绘图事半功倍
  4. MVC在基控制器中实现处理Session的逻辑
  5. session、flask session知识的相关收集
  6. Android第三十一期 - 市面上所有引导页的效果
  7. -bash: make: command not found的解决办法
  8. 崛起的中国服务器市场迎来旺盛的SPEC测试需求
  9. [Java开发之路](21)Comparator与Comparable
  10. Jquery学习笔记-获取select标签已经选中的值