CyclicBarrier、Semaphore、CountDownLatch的区别,适用场景

CyclicBarrierSemaphoreCountDownLatch 是 Java 并发包中用于线程协作的工具类,它们虽然都与线程同步相关,但设计目的和使用场景有显著差异。以下是它们的核心区别和典型应用场景:

1. CountDownLatch

核心机制
  • 一次性计数器:初始化时指定一个固定数值(count),线程调用 countDown() 减少计数器,其他线程通过 await() 等待计数器归零。
  • 不可重置:计数器归零后无法重复使用。
适用场景
  • 主线程等待子线程完成初始化:例如主线程等待所有服务启动后再处理请求。
  • 并行任务完成后汇总结果:多个子任务并行执行,主线程等待所有子任务完成后再汇总。
  • 模拟并发测试:通过 CountDownLatch 让所有线程同时开始执行。
特点
  • 一次性使用:计数器归零后不可重置。
  • 无回调机制,仅用于同步等待。
示例
CountDownLatch latch = new CountDownLatch(3);// 子线程完成任务后调用 countDown()
executor.submit(() -> {doTask();latch.countDown();
});// 主线程等待所有子线程完成
latch.await();

2. CyclicBarrier

核心机制
  • 可重复使用的屏障:一组线程相互等待,直到所有线程到达屏障点后,再一起继续执行。
  • 支持回调:可以指定一个 Runnable 任务,在所有线程到达屏障后触发。
适用场景
  • 多阶段任务协作:例如并行计算需要分阶段处理,每个阶段需等待所有线程完成。
  • 数据分批处理:多个线程处理数据后,在屏障点合并结果。
  • 模拟复杂并发逻辑:如多玩家游戏的回合制同步。
特点
  • 可重用:通过 reset() 方法重置计数器。
  • 支持屏障后回调函数,用于统一处理阶段结果。
示例
CyclicBarrier barrier = new CyclicBarrier(3, () -> {System.out.println("所有线程到达屏障点");
});executor.submit(() -> {doPhase1();barrier.await(); // 等待其他线程doPhase2();
});

3. Semaphore

核心机制
  • 资源访问控制:通过“许可证”机制限制同时访问共享资源的线程数。
  • 支持公平/非公平模式:防止线程饥饿。
适用场景
  • 资源池管理:如数据库连接池、线程池。
  • 限流:控制接口的最大并发请求数。
  • 互斥锁扩展:通过 Semaphore(1) 实现类似锁的功能(但更灵活,可跨方法释放)。
特点
  • 动态调整:通过 acquire()release() 增减许可数。
  • 支持超时和中断响应,避免死锁。
示例
Semaphore semaphore = new Semaphore(5); // 允许5个线程同时访问void accessResource() {semaphore.acquire(); // 获取许可try {useResource();} finally {semaphore.release(); // 释放许可}
}

关键区别总结

特性CountDownLatchCyclicBarrierSemaphore
重置能力一次性,不可重置可重复使用可重复使用
核心目的主线程等待子线程完成特定操作线程相互等待到屏障点控制资源访问的并发数
计数器方向递减(countDown()递增(await()获取/释放许可证(acquire()/release()
协作关系主线程等待子线程线程间相互等待线程与资源之间的协调
是否支持回调是(到达屏障后触发任务)
典型场景主从线程同步分阶段并行任务协同限流、资源池管理

如何选择?

  • 线程组协同(多阶段)CyclicBarrier
  • 主线程等待子线程完成CountDownLatch
  • 控制并发访问量或资源池Semaphore
  • 需重用或动态调整计数器CyclicBarrier 或 Semaphore

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新能源汽车测试中的信号调理模块:从原理到实战应用

摘要 信号调理模块(Signal Conditioning Module, SCM)是新能源汽车(NEV)测试系统中的关键环节,直接影响数据采集的精度与可靠性。本文面向HIL测试工程师、电机测试工程师及整车动力经济性测试工程师,系统性…

Qt5 Mac系统检查休眠

在开发跨平台应用程序时,有时候我们需要检测系统的状态,比如是否处于休眠或唤醒状态。Qt是一个强大的跨平台应用开发框架,支持多种操作系统,包括Windows、Linux、macOS等。在这个场景下,我们关注的是如何在Qt5.10中检测到系统是否休眠以及在Mac上实现这一功能。本文将深入…

RabbitMQ简单介绍和安装

RabbitMQ简单介绍 一.RabbitMQ介绍二.RabbitMQ的作用1.异步解耦2.流量削峰3.消息分发4.延迟通知 三.RabbitMQ安装(Ubuntu)1.先安装Erlang2.安装RabbitMQ3.安装RabbitMQ的管理界面4.创建虚拟机5.端口号信息 四.工作原理图 一.RabbitMQ介绍 RabbitMQ 是一款…

汇编学习之《call, return指令》

call 指令 call 指令就是调用函数的执行,不过它也是几个指令的组合 第一步通过jmp 函数地址的方式先跳转到函数 第二步通过push 指令将函数地址指令额下一行的指令的地址压入栈中。 我们来验证下 首先打开OllyDbg,导入你的程序,找到一个call 函数&…

接口自动化学习三:参数化parameterize

使用parametrize之前: def add(x,y):return xy class TestAddFunction(object):def test01(self):resadd(2,4)assert 6resdef test02(self):resadd(4,6)assert 10resparametrize参数化之后: import pytest def add(x,y):return xydata[(10,20,30),(200…

全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比

全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比 🚀 前言一、基础介绍 ✨1. Mybatis 简介 🔍2. Mybatis-Plus 简介 ⚡ 二、核心区别与高级特性对比 🔎1. 开发模式与配置管理2. 功能丰富度与扩展性3. 自动填充…

【区块链安全 | 第十九篇】类型之映射类型

文章目录 映射类型可迭代映射 映射类型 映射类型使用语法 mapping(KeyType KeyName? > ValueType ValueName?),映射类型的变量声明使用语法 mapping(KeyType KeyName? > ValueType ValueName?) VariableName。 KeyType 可以是任何内置值类型、bytes、st…

动态循环表单+动态判断表单类型+动态判断表单是否必填方法

页面效果: 接口请求到的数据格式: list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…

蓝桥杯DFS算法题(java)

最大连通 链接: https://www.lanqiao.cn/problems/2410/learning/ 问题描述 小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。 1100100000111111101010010010011010101110110110111010011111100100000000010100011011000000100101100011…

解锁物种分布模拟新技能:MaxEnt 模型与 R 语言的奇妙融合

技术点目录 第二章、常用数据检索与R语言自动化下载及可视化方法第三章、R语言数据清洗与特征变量筛选第四章、基于ArcGIS、R数据处理与进阶第五章、基于Maxent的物种分布建模与预测第六章、基于R语言的模型参数优化第七章、物种分布模型结果分析与论文写作 —————————…

三轴云台之相机技术篇

一、结构设计 三轴云台通常由空间上三个互相垂直的框架构成,包括内框(俯仰框)、中框(方位框)和外框(横滚框)。这些框架分别负责控制相机的俯仰运动、方位运动和横滚运动,从而实现对目…

全文 - MLIR Toy Tutorial Chapter 3 :高层次上语言特定的分析和变换

使用 C 风格的模式匹配和重写来优化转置运算 使用 DRR 优化 reshape 运算 创建一种贴近输入语言的语义表示的方言,可以在 MLIR 中分析、变换和优化,这些过程中需要用到高级语言的信息,而且通常是在语言的 AST 上执行的这些过程。…

js逆向入门图灵爬虫练习平台 第四题学习

(base64解码)地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNC8 先找到请求接口带有加密参数: 全局搜索Sign,找到参数生成位置 看到这就一目了然塞,知道参数是怎么构造生成的,不知道这段 JavaScript 代码没关系…

【Flask开发】嘿马文学web完整flask项目第2篇:2.用户认证,Json Web Token(JWT)【附代码文档】

教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…

[dp5_多状态dp] 按摩师 | 打家劫舍 II | 删除并获得点数 | 粉刷房子

目录 1.面试题 17.16. 按摩师 题解 2.打家劫舍 II 题解 3.删除并获得点数 题解 4.粉刷房子 题解 一定要有这样的能力,碰到一个新题的时候,可以往之前做过的题方向靠! 打家劫舍问题模型: 不能选择相邻的两个数,并且要最终…

基于javaweb的SSM羽毛球会员俱乐部系统场馆课程运动设计与实现(源码+文档+部署讲解)

技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

windows下git bash安装SDKMan报错Looking for unzip...Not found

需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换,但切换过程太繁琐,修改环境变量,达到切换目的。于是尝试其它解决方案,最终确实使用sdkman工具。 确保安装了git Git - Downloading Package 记住安装的路径,…

rnn的音频降噪背后技术原理

rnniose: 这个演示展示了 RNNoise 项目,说明了如何将深度学习应用于噪声抑制。其核心理念是将经典的信号处理方法与深度学习结合,打造一个小巧、快速的实时噪声抑制算法。它不需要昂贵的 GPU —— 在树莓派上就能轻松运行。 相比传统的噪声抑制系统&…

剑指Offer(数据结构与算法面试题精讲)C++版——day3

剑指Offer(数据结构与算法面试题精讲)C版——day3 题目一:数组中和为0的3个数字题目二:和大于或等于k的最短子数组题目三:乘积小于k的子数组 题目一:数组中和为0的3个数字 前面我们提到,在一个排…

全新UI好看404页面源码

源码介绍 全新UI好看404页面源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行 效果预览 源码获取 全新UI好看404页面源码