闭锁CountDownLatch和栅栏CyclicBarrier之异同举例
为什么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之异同举例相关推荐
- 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...
信号量semaphore 允许多个线程同时访问 读写锁ReadWriteLock 在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch obj = new Count ...
- java concurrent 栅栏,java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)
[一:java并发的开篇 1.在实际应用中,经常用到线程的并发,那为什么需要用到并发呢,不能独自单独的程序处理吗,那很明确的说,多条线程做完成一件事情和一条线程去完成 -闭锁(Latch) 闭锁(La ...
- Java并发工具类(闭锁CountDownLatch)
并发工具类系列: Java并发工具类(闭锁CountDownLatch) Java并发工具类(栅栏CyclicBarrier) Java并发工具类(信号量Semaphore) 闭锁是一种同步工具类,可 ...
- 非常有用的并发控制-循环栅栏CyclicBarrier
转载自 非常有用的并发控制-循环栅栏CyclicBarrier 昨天我讲了倒计时器CountDownLatch的应用,它是阻塞线程直到计时器归0的一种等待方式.今天讲的这个循环栅栏CyclicBarr ...
- 十三、栅栏CyclicBarrier
一.简介 栅栏CyclicBarrier的作用就是等待一组线程都准备好了,然后执行某个任务.这与CountDownLatch很相似. 但是CyclicBarrier和CountDownLatch是有区 ...
- 深入浅出 Java Concurrency (10): 锁机制 part 5 闭锁 (CountDownLatch)
闭锁(Latch) 闭锁(Latch):一种同 步方法,可以延迟线程的进度直到线程到达某个终点状态 .通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都 将通 ...
- 循环计数_倒计数器:CountDownLatch | 循环栅栏:CyclicBarrier
倒计数器:CountDownLatch CountDownLatch 从名字就可以看出其作用:初始化一个计数,然后每次递减,直至为0,然后触发一个动作.只有一个带参构造器: CountDownLatc ...
- JAVA 并发编程之三:CountDownLatch(门闩)、CyclicBarrier(栅栏)和Semaphore(信号量) 三种并发策略
在JDK的并发包中已经提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类中提供了一种并发流程控制的手段,Exchanger工具类提供了在 ...
- 信号量(Semaphore)、闭锁(Latch)、栅栏(Barrier)
目录 1.信号量(Semaphore) 描述 场景 Semaphore 2.闭锁(Latch) 描述 场景 CountDownLatch 3.栅栏(Barrier) 描述 场景 CyclicBarri ...
最新文章
- 模拟 CSU 1562 Fun House
- Python Split函数的用法总结
- 济南长清104国道科目三考试流程(转载)
- vuex第三弹vuex之actions(前端网备份)
- 小氓男-灰色按钮激活V1.0
- P3128 [USACO15DEC]Max Flow P
- 第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]
- Github | 标星20k+ Facebook 开源高效词表征学习库fastText
- 数据仓库中的两大经典模型
- AndroidStudio插件GsonFormat快速实现JavaBean
- 更改input标签的placeholder的样式
- 怎么看计算机的硬盘牌子,硬盘序列号,详细教您怎么查看硬盘序列号
- Mac VMWare键盘鼠标失灵
- 如何推广自己的新网站
- 爱因斯坦:三篇著名演讲
- 【魔域口袋版】一键端+一键配置器+架设教程+GM工具
- 电网计算机面试专业题,国家电网计算机管理员面试经验|面试题 - 职朋职业圈...
- 美通社企业新闻汇总 | 2019.1.18 | 联通与中兴打通全球首个5G智能终端;碧桂园化身产城运营服务商...
- C++中sprintf_s与sprintf的不同
- 【Linux】Linux下怎么下载安装Chrome?
热门文章
- 联想发布首款自研工业机器人,用5G技术给国产大飞机喷漆
- 一秒回到P图前:Adobe发布“反向PS”利器,知道你修过哪里,还帮你修回去
- PS常用快捷键就这些了,记住绘图事半功倍
- MVC在基控制器中实现处理Session的逻辑
- session、flask session知识的相关收集
- Android第三十一期 - 市面上所有引导页的效果
- -bash: make: command not found的解决办法
- 崛起的中国服务器市场迎来旺盛的SPEC测试需求
- [Java开发之路](21)Comparator与Comparable
- Jquery学习笔记-获取select标签已经选中的值