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 ...
随机推荐
- Angular 英雄示例教程
英雄指南教程(Tour of Heroes)涵盖了 Angular 的基本知识. 在本教程中,你将构建一个应用,来帮助人事代理机构来管理一群英雄. 这个入门级 app 包含很多数据驱动的应用所需的特性 ...
- (Java多线程系列一)快速入门
Java多线程快速入门 1.线程和进程的区别 进程是所有线程的集合,每一个线程是进程的一条执行路径. 2.多线程的应用场景 多线程主要体现在提高程序的效率,比如迅雷多线程下载,多线程分批发送短信等. ...
- BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)
题目链接 (luogu) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...
- Misha and Permutations Summation
A - Misha and Permutations Summation 首先这个 mod n! 因为数量级上的差别最多只会对康拓展开的第一项起作用所以这个题并不需要把 ord (p) 和 ord ( ...
- JavaScript插件制作-tab选项卡
JavaScript插件制作练习-鼠标划过选项卡切换图片 <!DOCTYPE html> <html> <head> <meta charset=" ...
- JS框架_(Vue.js)带有星期日期的数字时钟
百度云盘 传送门 密码:tv1v 数字时钟效果: <!doctype html> <html> <head> <meta charset="utf- ...
- 客户端框架-MVVM
MVVM Model-View-ViewModel 如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革.它是将"数据模型数据双向绑定"的思想作为核心,因此在View ...
- sqli-labs(45)
基于报错的password处的')闭合注入 就是没有报错信息 payload和43关一样的构造
- php的mysql语法
php操作mysqli(示例代码) 更新时间:2013年10月28日 :: 作者: 我要评论 关注脚本之家微信公众号(jb51net) 每周都有大礼相送哦 php操作mysqli的示例代码.需要的朋友 ...
- 如何把java项目打包成war包
用Eclipse手动打包 右击工程名 选择Export… 选择Web → WAR file 点击Browse,选择导出路径 然后war包就被导出来啦~是不是很简单呢 利用Maven的package命令 ...