什么是 Java 的 CyclicBarrier(代码示例)

2025-03-15 01:50

本文主要是介绍什么是 Java 的 CyclicBarrier(代码示例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《什么是Java的CyclicBarrier(代码示例)》CyclicBarrier是多线程协同的利器,适合需要多次同步的场景,本文通过代码示例讲解什么是Java的CyclicBarrier,感...

你的回答(口语化,面试场景)
面试官:什么是 JavaCyclicBarrier
你:
好的,我来举个例子说明。比如一个游戏需要5个玩家全部准备就绪才能开始,这时候可以用 CyclChina编程icBarrier

核心作用
CyclicBarrier 让一组线程互相等待,直到所有线程都到达屏障点(Barrier),再一起继续执行。它像一道关卡,必须等所有线程到齐才能放行。

核心特性

php
  • 可重复使用:所有线程通过屏障后,CyclicBarrier 会自动重置(比如玩家结束一局后,可以开始下一局)。
  • 支持回调:可以设置一个回调任务(Runnable),在所有线程到达屏障后触发(比如发游戏开始的广播)。
  • 使用场景
  • 分阶段任务:多线程分批次处理数据,等待所有线程完成第一阶段后,再统一进入第二阶段。
  • 压测模拟:模拟1000个用户同时发起请求(等所有线程就绪后同时触发)。
  • 分布式协同:多个微服务节点完成初始化后,同时对外提供服务。

代码示例

// 3个线程互相等待,全部到达后执行回调  
CyclicBarrier barrier = new CyclicBarrier(3, () -> {  
    System.out.println("所有玩家已就位,游戏开始!");  
});  
// 玩家线程  
executor.submit(() -> {  
    System.outwYWRlThSd.println("玩家A准备完成");  
    barrier.await();  // 等待其他玩家  
    System.out.println("玩家A开始游戏");  
});  
// 类似地提交玩家B、C的线程  

对比 CountDownLatch

  • 重置能力:CyclicBarrier 可重复用,CountDownLatch 只能一次性。
  • 触发角色:CyclicBarrier 是线程互相等待,CountDownLatch 是主线程等待子线程。

预测面试官可能的追问及回答
追问1:如果某个线程在 await() 时被中断了,会发生什么?
回答:

  • 被中断的线程会抛出 InterruptedException,同时其他等待的线程会收到 BrokenBarrierException,屏障会失效。
  • 需要调用 reset() 重置屏障后才能继续使用。

追问2:CyclicBarrier 底层是如何实现的?
回答:

  • 基于 ReentrantLock 和 Condition
    • 内部维护一个计数器,线程调用 await() 时计数器减1。
    • 当计数器归零时,触发回调任务,并唤醒所有等待线程。

知识框架与底层原理补充

核心机制
| 组件 | 作用 |
|---------------------|-------------------------------------------------------------------------|
| 屏障点(Barrier) | 线程必须等待其他线程到达的位置。 |
| Generation | 记录当前屏障的状态(是否已破坏),支持重置后复用。 |
| 回调任务 | 可选的 Runnable,由最后一个到达屏障的线程执行。 |

源码级实现逻辑

初始化:设置参与线程数(parties)和回调任务。

await() 流程:

  • 获取锁(ReentrantLock),检查屏障是否已破坏(Broken)。
  • 减少剩余计数(count),若 count == 0,执行回调并唤醒所有线程。
  • 若未归零,线程通过 Condition.await() 进入等待队列。

使用注意事项

  • 获取锁(ReentrantLock),检查屏障是否已破坏(Broken)。
  • 减少剩余计数(count),若 count == 0,执行回调并唤醒所有线程。
  • 若未归零,线程通过 Condition.await() 进入等待队列。

实战案例

  • 场景:电商大促时,统计各区域销量并汇总。
  • 方案:

创建 CyclicBarrier,线程数与区域数相同。

每个线程计算一个区域的销量,完成后调用 await()

所有线程到达后,触发回调任务汇总总销量。

CyclicBarrier barrier = new CyclicBarrier(4, () -> {  
    System.out.println("全部区域销量计算完成,总销量:" + total);  
});  
// 4个区域计算线程  
phpfor (int i = 0; i < 4; i++) {  
python    executor.submit(() -> {  
        calculateRegionSales();  
        barrier.await();  
    });  
}  

总结

  • CyclicBarrier 是多线程协同的利器,适合需要多次同步的场景(如分阶段任务)。
  • 理解底层锁机制和异常处理,避免因线程中断导致屏障失效。
  • 优先于 CountDownLatch 的场景:需重复触发同步点,或需要回调任务统一处理结果。

到此这篇关于什么是 Java 的 CyclicBarrier的文章就介绍到这了,更多相关Java 的 CyclicBarrier内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于什么是 Java 的 CyclicBarrier(代码示例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过