CountDownLatch与CyclicBarrier的对比
CountDownLatch:
CountDownLatch通过计数器来实现,计数器表示线程的数量。每当一个线程执行结束后,计数器的值就会减1,并在await方法处阻塞。一旦计数器为0,所有阻塞的线程均被释放,await方法后所有后续动作都会开始执行。计数器无法被重置。
并发模拟CountDownLatch
import java.util.concurrent.CountDownLatch; public class CountRunnable implements Runnable {
private CountDownLatch countDownLatch; public CountRunnable(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
} @Override
public void run() {
try {
synchronized (countDownLatch) {
countDownLatch.countDown();
System.out.println("down latch count = " + countDownLatch.getCount());
}
countDownLatch.await();
System.out.println("current count = " + (5 - countDownLatch.getCount()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class CountDownTest {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
CountDownLatch cdl = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
CountRunnable countRunnable = new CountRunnable(cdl);
pool.execute(countRunnable);
}
}
}
控制台输出:
down latch count = 4
down latch count = 3
down latch count = 2
down latch count = 1
down latch count = 0
current count = 5
current count = 5
current count = 5
current count = 5
current count = 5
观察到线程countDownLatch.countDown()方法后阻塞在await方法处,当所有线程都执行countDownLatch.countDown()方法后,即计数器count减为0后,每个线程的await()方法就会立刻return,从而执行之后的方法
CyclicBarrier:
CyclicBarrier可以协同多个线程,每个线程到达这个屏障处时都会等待,直到所有线程都到达了这个屏障时,再一起继续执行后面的动作。
模拟CyclicBarrier
import java.util.concurrent.CyclicBarrier; public class CyclicBarrierThread extends Thread {
private CyclicBarrier cb; private int sleepSecond; public CyclicBarrierThread(CyclicBarrier cb, int sleepSecond) {
this.cb = cb;
this.sleepSecond = sleepSecond;
} public CyclicBarrier getCb() {
return cb;
} public void setCb(CyclicBarrier cb) {
this.cb = cb;
} public int getSleepSecond() {
return sleepSecond;
} public void setSleepSecond(int sleepSecond) {
this.sleepSecond = sleepSecond;
} public void run() {
try {
System.out.println(this.getName() + "start run ...");
Thread.sleep(sleepSecond * 1000);
System.out.println(this.getName() + "start to wait, time is " + System.currentTimeMillis());
cb.await();
System.out.println(this.getName() + "end wait, time is " + System.currentTimeMillis());
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.util.concurrent.CyclicBarrier; public class Test {
public static void main(String[] args) throws Exception {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("CyclicBarrier的所有线程await()结束了,开始指定的Runnable运行, 时间为" + System.currentTimeMillis());
}
}; CyclicBarrier cb = new CyclicBarrier(3, runnable);
CyclicBarrierThread cbt0 = new CyclicBarrierThread(cb, 3);
CyclicBarrierThread cbt1 = new CyclicBarrierThread(cb, 6);
CyclicBarrierThread cbt2 = new CyclicBarrierThread(cb, 9);
cbt0.start();
cbt1.start();
cbt2.start();
}
}
控制台输出
Thread-1 start run ...
Thread-2 start run ...
Thread-0 start run ...
Thread-0 start to wait, time is 1575901627885
Thread-1 start to wait, time is 1575901630884
Thread-2 start to wait, time is 1575901633886
CyclicBarrier的所有线程await()结束了,开始指定的Runnable运行, 时间为1575901633886
Thread-2 end wait, time is 1575901633886
Thread-0 end wait, time is 1575901633886
Thread-1 end wait, time is 1575901633886
观察到所有线程都运行到了await()方法的时候,所有线程后面的代码以及指定的Runnable同时运行
综上:
1.CountDownLatch本质是一个计数器,线程执行一次,计数器减一,只能单次使用;而CyclicBarrier类似阀门或者栅栏,需要所有线程都到达,然后才能继续执行,可以多次使用
CountDownLatch与CyclicBarrier的对比的更多相关文章
- 并发编程常用工具类(一) countDownLatch和cyclicBarrier的使用对比
1.CountDownLatch countDownLatch的作用是让一组线程等待其他线程完成工作以后在执行,相当于加强版的join(不懂可以百度一下join的用法),一般在初始 ...
- 并发工具类:CountDownLatch、CyclicBarrier、Semaphore
在多线程的场景下,有些并发流程需要人为来控制,在JDK的并发包里提供了几个并发工具类:CountDownLatch.CyclicBarrier.Semaphore. 一.CountDownLatch ...
- Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析
1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...
- 并发编程(七)——AbstractQueuedSynchronizer 之 CountDownLatch、CyclicBarrier、Semaphore 源码分析
这篇,我们的关注点是 AQS 最后的部分,共享模式的使用.本文先用 CountDownLatch 将共享模式说清楚,然后顺着把其他 AQS 相关的类 CyclicBarrier.Semaphore 的 ...
- 【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser
个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢.我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性. 所以,针对java并 ...
- 【Java并发工具类】CountDownLatch和CyclicBarrier
前言 下面介绍协调让多线程步调一致的两个工具类:CountDownLatch和CyclicBarrier. CountDownLatch和CyclicBarrier的用途介绍 CountDownLat ...
- CountDownLatch和CyclicBarrier 傻傻的分不清?超长精美图文又来了
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- CountDownLatch、CyclicBarrier、Semaphore、Exchanger 的详细解析
本文主要介绍和对比我们常用的几种并发工具类,主要涉及 CountDownLatch . CyclicBarrier . Semaphore . Exchanger 相关的内容,如果对多线程相关内容不熟 ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
随机推荐
- [洛谷P2605] ZJOI2016 基站选址
问题描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄不超过Si的范 ...
- Adboost几个要点分析
1.本质就是前向步进算法和加法模型,每一步计算分类器权重alpha和基分类器. 2.总体降低指数误差函数,转化为每一步降低分类误差率. 因为右边可以看作常数,所以相当于对这个进行优化 但是这一步可能做 ...
- 'EF.Utility.CS.ttinclude' returned a null or empty string.
需要安装https://www.microsoft.com/en-us/download/details.aspx?id=40762
- 20.logging模块
# __________________________________________________ # 创建一个logger logger = logging.getLogger() logge ...
- liunx系统中安装lua以及torch
一直在用pytorch,最近在做项目的时候,遇到了torch的开源代码,所以又开始不得不接触torch以及他所依赖的环境lua. liunx下lua环境的配置代码如下: ''' curl -R -O ...
- 浏览器使用小tip
谷歌浏览器截取长图 很多网页长图单个页面截不下来,那么需要如何解决? 首先,在谷歌浏览器chrome中打开需要截图的网页,等待需要截图的网页打开完毕,然后按F12 打开开发者工具,然后按组合键 Ctr ...
- SQL中模糊查询的模式匹配
SQL模糊查询的语法为: “Select column FROM table Where column LIKE 'pattern'”. SQL提供了四种匹配模式: 1. % 表示任意0个或多个字符. ...
- set集合 ,深浅拷贝
一 之前内容的补充 1.join() 将列表转换成字符串 2.split()将字符串转换成列表 3列表和字典在进行For循环时是不可以删除的(准确的说是删除的不彻底) 删除操作需要先创建一个新的空列 ...
- redhat7.2配置yum源
版权声明:声明:本博客欢迎转发,但请保留原作者信息!本站文章皆基于公开来源信息,仅代表作者个人观点 https://blog.csdn.net/wylfengyujiancheng/article ...
- Wazuh 实操
https://www.jianshu.com/p/40c911a5628e?from=timeline&isappinstalled=0