java常用的并发工具类-CyclicBarrier

2024-09-04 11:20

本文主要是介绍java常用的并发工具类-CyclicBarrier,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、CyclicBarrier 的概述

CyclicBarrier 是 Java 并发包(java.util.concurrent)中的一个同步辅助类。它允许一组线程互相等待,直到所有线程都到达一个公共的屏障点(barrier)。当最后一个线程到达时,屏障就会打开,所有线程可以继续执行。CyclicBarrier 可以被反复使用,即当线程们通过屏障后,它可以被重置并再次使用。

1.1 主要构造方法

CyclicBarrier 提供了两个主要的构造方法:

  1. CyclicBarrier(int parties):创建一个新的 CyclicBarrier,指定参与者的数量(即线程数)。
  2. CyclicBarrier(int parties, Runnable barrierAction):除了指定线程数外,还可以提供一个在最后一个线程到达屏障时执行的动作(barrierAction)。
1.2 工作原理

CyclicBarrier 的工作原理非常简单。假设有 N 个线程,它们必须在某个时刻同步。你可以创建一个 CyclicBarrier,并将 N 传递给它。每个线程调用 await() 方法时,都会进入阻塞状态,直到第 N 个线程也调用了 await() 方法,此时所有线程都被释放,继续执行各自的后续操作。

二、CyclicBarrier 的使用方法

下面是 CyclicBarrier 的基本用法示例。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierExample {public static void main(String[] args) {int numberOfThreads = 5;CyclicBarrier barrier = new CyclicBarrier(numberOfThreads, () -> {System.out.println("All parties have arrived at the barrier, let's proceed.");});for (int i = 0; i < numberOfThreads; i++) {new Thread(new Task(barrier)).start();}}
}class Task implements Runnable {private CyclicBarrier barrier;public Task(CyclicBarrier barrier) {this.barrier = barrier;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " is waiting at the barrier.");try {barrier.await();System.out.println(Thread.currentThread().getName() + " has crossed the barrier.");} catch (InterruptedException | BrokenBarrierException e) {e.printStackTrace();}}
}

在这个例子中,有 5 个线程需要在同一个屏障点等待。CyclicBarrier 的构造函数中传递了一个 Runnable 实例,这个实例将在所有线程到达屏障后被执行。所有线程在到达屏障后,会被阻塞,直到所有线程都调用了 await() 方法。然后,所有线程都会继续执行。

三、CyclicBarrier 的应用场景

CyclicBarrier 适用于那些需要线程协同工作的场景,例如:

3.1 多阶段任务

在多阶段任务中,每个阶段都需要多个线程同时完成。使用 CyclicBarrier,可以确保所有线程在进入下一个阶段之前都已完成当前阶段的工作。

3.2 集群计算

在分布式计算或并行处理场景下,多个线程(或节点)需要处理数据的不同部分,然后在某个时刻合并结果。这种情况下,CyclicBarrier 可以用来同步所有线程,使它们在合并数据之前完成各自的计算任务。

3.3 测试并发代码

在测试并发代码时,需要多个线程同时启动执行,以模拟高并发场景。CyclicBarrier 可以帮助实现这一点,通过让所有线程在相同点启动,从而模拟并发。

四、CyclicBarrier 与其他并发工具类的对比

4.1 CyclicBarrier vs CountDownLatch

CountDownLatch 也是一个常用的同步工具类,但与 CyclicBarrier 不同。CountDownLatch 允许一个或多个线程等待一组其他线程完成,而 CyclicBarrier 是让一组线程相互等待,直到所有线程都到达某个共同点。CountDownLatch 是一次性的,而 CyclicBarrier 是循环使用的。

4.2 CyclicBarrier vs Phaser

Phaser 是一个更复杂且灵活的同步工具类,它可以用来替代 CyclicBarrier 和 CountDownLatch。Phaser 支持动态增加或减少参与者,并且适用于更加复杂的阶段任务。CyclicBarrier 适用于简单的场景,而 Phaser 则适合处理更复杂的多阶段同步。

五、CyclicBarrier 的常见问题

  1. 线程抛出异常导致屏障失效:如果某个线程在调用 await() 方法后抛出异常,那么屏障可能会处于“破损”状态,此时所有后续调用 await() 的线程会抛出 BrokenBarrierException
  2. 屏障的重用性:每当所有线程通过屏障后,CyclicBarrier 会自动重置,并可以再次使用。这与 CountDownLatch 的一次性使用有很大的不同。
  3. 超时机制:CyclicBarrier 的 await() 方法还支持超时机制,可以指定一个最大等待时间,如果在超时时间内屏障没有被触发,线程将抛出 TimeoutException

六、总结

CyclicBarrier 是 Java 并发编程中的重要工具类,用于在多线程环境中实现线程之间的同步。它允许一组线程在一个共同点等待,直到所有线程都到达后再继续执行。CyclicBarrier 非常适合多阶段任务、集群计算和测试并发代码等场景。尽管 CyclicBarrier 在许多场景中非常有用,但在复杂的并发控制需求下,Phaser 可能会是一个更好的选择。
CyclicBarrier 是 Java 并发编程中一个非常有用的工具类,用于协调多个线程之间的同步。在并发编程中,有时需要让多个线程在执行到某个点时彼此等待,直到所有线程都到达这个点后再继续执行。这种场景下,CyclicBarrier 是一个很好的选择。

这篇关于java常用的并发工具类-CyclicBarrier的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135875

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致