首页 > 其他分享 >CountDownLatch、CyclicBarrier 使用区别

CountDownLatch、CyclicBarrier 使用区别

时间:2023-04-03 09:11:54浏览次数:51  
标签:world 区别 private 屏障 线程 CountDownLatch new CyclicBarrier

主要区别

  • CountDownLatch:所有子线程完成后,再执行主线程
  • CyclicBarrier: 所有子线程就绪后,再执行子线程

CountDownLatch

所有子线程完成后,再执行主线程
image

多线程 ThreadPoolTaskExecutor 应用
SpringBoot 下载文件

CyclicBarrier

有若干个线程,比如说有五个线程,需要它们都到达了某一个点之后才能开始一起执行,也就是说假如其中只有四个线程到达了这个点,还差一个线程没到达,此时这四个线程都会进入等待状态,直到第五个线程也到达了这个点之后,这五个线程才开始一起进行执行状态

所有子线程就绪后,再执行子线程
image
所有子线程都已经到达屏障之后,此时屏障就会消失,所有子线程继续执行,若存子线程尚未到达屏障,其他到达了屏障的线程都会进行等待
CyclicBarrier对于涉及到固定大小的线程是非常有用的,线程们必须相互等待。该屏障称之为循环屏障,是因为当等待屏障的线程被释放之后,该屏障能循环使用

package com.concurrency2;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;

public class MyTest1 {
    public static void main(String[] args) {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
        for(int i = 0;i < 3;i ++) {
            new Thread(() -> {
                try {
                    Thread.sleep((long)(Math.random() * 2000));

                    int randomInt = new Random().nextInt(500);
                    System.out.println("hello " + randomInt);

                    cyclicBarrier.await();

                    System.out.println("world " + randomInt);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

输出

hello 30
hello 471
hello 343
world 343
world 471
world 30

重要成员变量

// 可以理解为初始化时 需要阻塞的任务个数
private final int parties;
// 剩余需要等待的任务个数,初始值为parties,直到为0时依次唤醒所有被阻塞的任务线程。
private int count;

// 每次对“栅栏”的主要成员变量进行变更操作,都应该加锁
private final ReentrantLock lock = new ReentrantLock();
// 用于阻塞和唤醒任务线程
private final Condition trip = lock.newCondition();

// 在所有线程被唤醒前,需要执行的一个Runable对应的run方法
private final Runnable barrierCommand;
// 用于表示“栅栏”当前的状态
private Generation generation = new Generation();

标签:world,区别,private,屏障,线程,CountDownLatch,new,CyclicBarrier
From: https://www.cnblogs.com/vipsoft/p/17271609.html

相关文章

  • OMM和CMM的测量区别
    CMM(坐标测量机,CoordinateMeasuringMachine)和OMM(光学测量机,OpticalMeasuringMachine)是两种常用的测量设备,它们在工程、制造和质量控制领域中广泛应用。这两种测量设备有各自的优缺点,适用于不同的测量任务。下面我们对比一下它们之间的区别及差异原因:1.工作原理CMM:CMM通常使......
  • nginx负载均衡和反向代理的区别
    nginx负载均衡和反向代理的区别有:1、实现负载均衡一定要需要反向代理;2、反向代理主要是缓存东西,而负载均衡则是减少高并发情况;3、负载均衡是做反向代理的目的之一。下面是详细介绍:负载均衡需要通过反向代理来实现。反向代理就是指nginx作为前端服务器,将请求转发到后端,再将后端......
  • Spice模型和IBIS模型的区别
    Spice模型的特点Spice模型是进行电路级仿真的。电流,电压,电容等节点的具体参数是从元器件图形、材料特性得来,是建立在低级数据的基础上,每个BUFFER中的元器件分别被描述和仿真。仿真模型包含了详细的芯片内部设计信息。但仿真速度比较慢,只适用于电路级的设计者。IBIS模型的特点IBIS......
  • 字符串和字符数组的区别
    intmain(){charstr1[]={'h','e','l','l','o'};charstr2="hello";//'\0'intlen1=sizeof(str1)/sizeof(char);//5intlen2=sizeof(str2)/sizeof(char);......
  • 点击事件on和onclick 两者之间的区别(很重要)
    点击事件on和onclick两者之间的区别左又于2018-04-2009:20:36发布10897收藏5分类专栏:js版权js专栏收录该内容45篇文章0订阅订阅专栏点击事件on和onclick两者之间的区别(很重要)第1种事件$('.XX').click('.xxx',function(){alert('xxx')}); 第2种事件$('.......
  • 软连接和硬链接区别、创建和删除
    软连接和硬链接区别在linux系统中有种文件是链接文件,可以为解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(HardLink),另一种是软链接,也称为符号链接(SymbolicLink)。通过ll命令查看linux系统中哪些是链接文件。上图文件列表中第一列权限位标识第一个字符显示的是文件......
  • Go 语言数组和切片的区别
    原文链接:Go语言数组和切片的区别在Go语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。另外,这个问题在面试中也经常会被问到,属于入门级题目,看过文章之后,相信你会有一个很好的答案。数组数组是同一种数据类型元素的集合,数组在......
  • 函数RANK,DENSE_RANK和ROW_NUMBER之间的区别
    MYSQL8已经支持了排名函数RANK,DENSE_RANK和ROW_NUMBER。但是在就得版本中还不支持这些函数。RANK并列跳跃排名,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,跳跃到总共的排名。DENSE_RANK并列连续排序,并列即相同的值,相同的值保留重复名次,遇到下一个不同值时,依然按照连......
  • 面试突击:MVCC 和间隙锁有什么区别?
    MVCC和间隙锁是两种完全不同的机制,但它们的目的都是相同的,都是用来保证数据库并发访问的,我们先来看二者的定义。MVCC定义MVCC是多版本并发控制(Multi-VersionConcurrencyControl)的缩写,是一种并发控制的方法。在MVCC中,每个读操作会看到一个固定版本的数据库记录,即使在并发环境......
  • 拉氏变换与傅氏变换的区别
    拉氏变换(拉普拉斯变换)一个函数的傅氏变换存在的充分条件是一方面是这个函数必须是绝对可积的,另一方面是这个函数必须在\((-\infty,\infty)\)上有定义。对于那些定义在\((0,\infty)\)上的任意函数,傅氏变换不一定存在。所以为了使得对定义在\((0,\infty)\)上的任意函数也可以进行......