首页 > 其他分享 >并发同步计数器 CountDownLatch

并发同步计数器 CountDownLatch

时间:2024-04-11 17:57:41浏览次数:28  
标签:int CountDownLatch 并发 计数器 线程 countDownLatch static

概念解释

CountDownLatch 是 Java 中的一个同步辅助类,它可以让一个或多个线程等待其他线程完成操作后再继续执行。CountDownLatch 内部维护了一个计数器,当计数器的值减为0时,所有等待的线程就会被唤醒。

 

CountDownLatch 的主要方法包括:

  1. 构造方法:CountDownLatch(int count) 构造一个 CountDownLatch 对象,指定计数器的初始值为 count。
  2. await():让当前线程等待,直到计数器的值减为0。
  3. countDown():将计数器的值减1,当计数器的值减为0时,所有等待的线程会被唤醒。

CountDownLatch 的典型用法包括:

  1. 一个或多个线程等待其他线程完成某些操作后再继续执行。
  2. 主线程等待所有子线程执行完毕后再进行汇总处理。
  3. 多个子任务并发执行,最后汇总结果。

 基本用法

// 创建一个 CountDownLatch 对象
CountDownLatch countDownLatch = new CountDownLatch(子线程个数);

// 子线程1开始处理逻辑
...
// 子线程执行完所有逻辑进行计数器减1
countDownLatch.countDown();

// 子线程n开始处理逻辑
...
// 子线程执行完所有逻辑进行计数器减1
countDownLatch.countDown();

// 主线程等待所有子线程执行完
countDownLatch.await();
// 主线程继续执行后继逻辑
...

场景

CountDownLatch 经常用于某一线程在开始运行前等待其他关联线程执行完毕的场合。

比如我们制作一张复杂报表,报表的各部分可以安排对应的一个线程进行计算,只有当所有线程都执行完毕后,再由最终的报表输出线程进行报表文件生成。

下面我们使用 CountDownLatch 实现这个例子。假设这张报表有 5 个部分,我们总共安排 5 个子线程分别计算,再设置 1 个报表输出线程用于最终生成报表文件。请看下面代码。

public class CollectionsExample2 {

    // 请求总数
    public static int clientTotal = 5000;

    // 同时并发执行的线程数
    public static int threadTotal = 200;

    private static final Set<Integer> set = Collections.synchronizedSet(Sets.newHashSet());

    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(threadTotal);
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
        for (int i = 0; i < clientTotal; i++) {
            final int count = i;
            executorService.execute(() -> {
                try {
                    semaphore.acquire();
                    update(count);
                    semaphore.release();
                } catch (Exception e) {
                    log.error("exception", e);
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        executorService.shutdown();
        log.info("size:{}", set.size());
    }

    private static void update(int i) {
        set.add(i);
    }
}

 

标签:int,CountDownLatch,并发,计数器,线程,countDownLatch,static
From: https://www.cnblogs.com/RedOrange/p/18056678

相关文章

  • 限制异步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配置的云服务器备受关注。那么,这款服务器究竟能支撑多少人的并发量呢?首先,我们要明确一个概念:并发量不仅取决于服务器的硬件配置,还与应用程序的类型......
  • 并发编程之AtomicInteger,AtomicLong,LongAdder
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。AtomicInteger类是系统底层保护的int类型,通过提供执行方法的控制进行......
  • EFCore 高并发
    EFCore高并发有常见的并发场景?如果我们使用EFCore常用的解决方法会出现哪些问题?对应不同的并发场景我们应该选择哪些的处理方式?参照:事务的四种隔离级别详解_事务隔离级别-CSDN博客什么是高并发高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让......
  • linux服务器 tcp高并发压测需要设置项
    linux服务器部署了一个tcp服务,需要进行并发压力测试 看看服务器能支持多少个tcp长连接  预计会有50w个连接需要设置linux不然是无法支持这么多连接的  如果达到这个值是无法建立新连接的 报错信息一般为 toomanyopenfiles 1, fs.file-max li......
  • Java高并发解决方案
    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。这次我们会关注秒杀和抢购的技术实现和优化,同时,从技术层面揭开,为什么我们总是不容易抢到......
  • JAVA高并发的三种实现
    提到锁,大家肯定想到的是sychronized关键字。是用它可以解决一切并发问题,但是,对于系统吞吐量要求更高的话,我们这提供几个小技巧。帮助大家减小锁颗粒度,提高并发能力。初级技巧-乐观锁乐观锁使用的场景是,读不会冲突,写会冲突。同时读的频率远大于写。 悲观锁的实现: 悲观的......