首页 > 其他分享 >并发同步工具CyclicBarrier 的使用介绍

并发同步工具CyclicBarrier 的使用介绍

时间:2024-04-11 17:58:13浏览次数:20  
标签:同步 log int 并发 屏障 线程 threadNum CyclicBarrier

概念

CyclicBarrier 是 Java 中的另一个同步辅助类,它可以让一组线程互相等待,直到所有线程都达到一个屏障点后再继续执行。与 CountDownLatch 不同的是,CyclicBarrier 的计数器可以循环使用,当所有线程都到达屏障点后,计数器会重置,可以被复用。

所谓 Cyclic 即循环的意思,所谓 Barrier 即屏障的意思。所以综合起来,CyclicBarrier 指的就是循环屏障,虽然这个叫法很奇怪,但是却能很好地表达其含义。

CyclicBarrier 工具类允许一组线程相互等待,直到所有线程都到达一个公共的屏障点,然后这些线程一起继续执行后继逻辑。之所以称之为 “循环”,是因为在所有线程都释放了对这个屏障的使用后,这个屏障还可以重新使用。我们通过一张图可以直观了解其表达的控制模型。

 

CyclicBarrier 的主要方法包括:

  1. 构造方法:CyclicBarrier(int parties) 构造一个 CyclicBarrier 对象,指定参与线程的数量 parties。
  2. await():让当前线程等待,直到所有参与线程都到达屏障点。

CyclicBarrier 的典型用法包括:

  1. 多个线程分阶段执行任务,每个阶段结束后等待其他线程,然后一起执行下一个阶段。
  2. 多个线程同时执行不同任务,等待所有任务完成后再进行下一步操作。

基本用法

public class CyclicBarrierExample1 {

    private static final CyclicBarrier barrier = new CyclicBarrier(5);

    private static  CyclicBarrier barrier 2= new CyclicBarrier(5,new Runnable() {
        @Override
        public void run() {
            System.out.println("5人已来,可以开席了");
        }
    });

    public static void main(String[] args) throws Exception {

        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            final int threadNum = i;
            Thread.sleep(1000);
            executor.execute(() -> {
                try {
                    race(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                }
            });
        }
        executor.shutdown();
    }

    private static void race(int threadNum) throws Exception {
        Thread.sleep(1000);
        log.info("{} is ready", threadNum);
        barrier.await();
        log.info("{} continue", threadNum);
    }

 

其他方法介绍

除过上面代码中使用的最基本的 await()方法之外,还有下面几个方法大家可以了解一下。

    1. CyclicBarrier(int parties)
      相比案例中使用的 CyclicBarrier(int parties, Runnable barrierAction) 构造方法,此方法只用于控制并发线程,不做屏障点到达后的其他动作。

    2. await(long timeout, TimeUnit unit) 方法
      此方法可以设置等待的时限,当时限过后还未被唤起,则直接自行唤醒继续执行后继任务。

 private static void race(int threadNum) throws Exception {
        Thread.sleep(1000);
        log.info("{} is ready", threadNum);
        try {
            barrier.await(2000, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            log.warn("BarrierException", e);
        }
        log.info("{} continue", threadNum);
    }

 

getNumberWaiting() 方法

    1. 调用此方法,可以获得当前还在等待屏障点解除的线程数,一般用于了解整体处理进度。

 

标签:同步,log,int,并发,屏障,线程,threadNum,CyclicBarrier
From: https://www.cnblogs.com/RedOrange/p/18056751

相关文章

  • 并发同步计数器 CountDownLatch
    概念解释CountDownLatch是Java中的一个同步辅助类,它可以让一个或多个线程等待其他线程完成操作后再继续执行。CountDownLatch内部维护了一个计数器,当计数器的值减为0时,所有等待的线程就会被唤醒。 CountDownLatch的主要方法包括:构造方法:CountDownLatch(intcount)构......
  • 限制异步HTTP请求并发:简单、有效的20个并发下载控制策略
     概述:通过使用`SemaphoreSlim`,可以简单而有效地限制异步HTTP请求的并发量,确保在任何给定时间内不超过20个网页同时下载。`ParallelOptions`不适用于异步操作,但可考虑使用`Parallel.ForEach`,尽管在异步场景中谨慎使用。对于并发异步I/O操作的数量限制,可以使用SemaphoreSlim,......
  • 如何设计一个高并发系统?
    一、为什么要做高并发首先你得知道你当前的项目为什么要做高并发,之前的单体架构为什么不满足你的需求?当前的系统架构已经远远不能满足你的业务需求?当前的系统的并发数已经越来越多,加机器代理已经无法解决此问题?当前系统用户数越来越多,数据量越来越大,数据库极可能在崩的边缘?......
  • Golang 中 在gmp下,mutex 是如何并发的
    在Go语言的并发模型中,GMP(Goroutine、Machine、Processor)模型是核心概念,其中Mutex(互斥锁)扮演着关键的角色,用于同步并发访问共享资源,防止数据竞争和不一致性问题。以下是Mutex在GMP模型下实现并发的详细解释:Goroutines(协程)轻量级的线程:Goroutines是Go语言中的轻量级线程,它......
  • 腾讯云2核4G5M轻量服务器测评报告:在线并发人数实测及优惠购买地址分享
    在当今这个数据驱动的时代,云服务器的选择对于企业和个人而言都至关重要。其中,腾讯云2核4G5M轻量应用服务器因其高性价比而备受瞩目。那么,这款服务器到底能支持多少人同时在线呢?它的并发性能又如何呢?首先,我们要明白并发数是指同一时刻内,服务器能够处理的用户请求数量。对于腾讯......
  • 2024年腾讯云8核16G服务器性能评测:高并发场景下的表现如何?
    在当今的云计算时代,服务器的配置与性能直接关系到应用程序的稳定运行和用户体验。腾讯云作为国内领先的云服务提供商,其8核16G18M配置的云服务器备受关注。那么,这款服务器究竟能支撑多少人的并发量呢?首先,我们要明确一个概念:并发量不仅取决于服务器的硬件配置,还与应用程序的类型......
  • CyclicBarrier 使用案例详解
    CyclicBarrier概念:CyclicBarrier字面意思是环栅栏,是JUC下的一个并发工具,跟CountDownLatch很相似,都可以使线程先等待然后再执行,但是它的功能比CountDownLatch更加复杂和强大,CountDownLatch是一个或者多个线程等待另外一批线程执行完毕后,在接着执行,而CyclicBarrie......
  • 美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了
    写在开头今天在牛客上看到了一个帖子,一个网友吐槽美团一面上来就让手撕同步器,没整出来,结果面试直接凉凉。就此联想到一周前写的一篇关于AQS知识点解析的博文,当时也曾埋下伏笔说后面会根据AQS的原理实现一个自定义的同步器,那今天就来把这个坑给填上哈。常用的AQS架构同步器类......
  • 并发编程之AtomicInteger,AtomicLong,LongAdder
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。AtomicInteger类是系统底层保护的int类型,通过提供执行方法的控制进行......
  • 高可用的半同步主从复制MySQL集群
    目录项目信息项目结构项目描述项目环境项目步骤IP规划部署一台ansible服务器,搭建好免密通道并定义主机清单,在四台机器上批量安装MySQL,配置好相关环境搭建ssh免密通道使用ansible批量安装MySQL规划MySQL集群,一台做master,三台做slave配置/etc/my.cnf使用mysqldump......