当前位置: 首页 > article >正文

Java并发——CAS(比较并替换)

在多线程编程中如何安全地修改共享变量是永恒的课题。传统的synchronized关键字虽然保证了线程安全但基于互斥锁的机制会导致线程阻塞、上下文切换在竞争激烈的场景下可能成为性能瓶颈。于是一种更轻量的同步方案——CASCompare And Swap应运而生它承载了无锁并发思想的落地实践。本文将带你系统了解CAS的核心原理、底层实现、在Java中的应用以及必须面对的挑战帮助你真正掌握这把并发编程的利器。一、什么是CASCAS的全称是Compare And Swap比较并交换它是一种CPU原语级的原子操作用于实现多线程环境下共享变量的无锁修改。它包含三个核心参数V主内存中的当前值变量实际存储的位置A线程预期的旧值线程从主内存读取后保存在本地的副本B线程希望写入的新值CAS的执行过程极其简单如果 V A则将 V 更新为 B否则不做任何操作。整个“比较交换”过程由CPU硬件保证原子性不会被任何其他线程中断。从宏观上看CAS是一条乐观的指令它假定在读取之后到更新之前没有其他线程修改过该变量如果检测到被修改过就失败重试。这种“失败则重试”的模式被称为自旋。二、为什么需要CAS考虑一个经典的计数器累加场景private int count 0; public void increment() { count; }count在字节码层面被拆分为“读取-修改-写回”三步多线程并发执行时必然出现数据覆盖最终结果小于预期。传统的解决方案是使用synchronizedpublic synchronized void increment() { count; }但synchronized是悲观锁无论是否有竞争都会加锁线程获取锁失败时会进入阻塞状态触发操作系统级别的上下文切换开销较大。CAS提供了一种乐观的替代方案它假设大多数情况下没有冲突只在更新时检查失败则重试避免了线程挂起和唤醒的开销。在竞争不激烈的场景下CAS的性能远优于synchronized。三、CAS的底层实现1. CPU层面的支持CAS的原子性依赖于CPU提供的特殊指令。以x86架构为例它提供了CMPXCHG指令该指令可以完成“比较并交换”的操作。在多核环境下该指令前会加上LOCK前缀确保执行期间锁住总线或缓存行防止其他核心同时访问该内存地址从而保证原子性。ARM架构则使用LDXR/STXR指令对通过独占监视器实现类似的原子操作。2. Java中的Unsafe类在Java中CAS操作由sun.misc.Unsafe类提供支持。该类是一个不安全的底层操作类能够直接操作内存地址、执行CAS操作等。典型的CAS方法如下public final native boolean compareAndSwapInt(Object obj, long offset, int expect, int update);其中offset是字段在对象中的内存偏移量可以通过objectFieldOffset获取。普通开发者不应直接使用Unsafe而是通过JDK提供的封装类——java.util.concurrent.atomic包下的原子类——来安全使用CAS。3. AtomicInteger的源码解析以AtomicInteger.incrementAndGet()为例我们看一下CAS的典型应用public final int incrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, 1) 1; }而getAndAddInt的实现是典型的自旋CASpublic final int getAndAddInt(Object obj, long offset, int delta) { int current; do { current this.getIntVolatile(obj, offset); // 获取当前值 } while (!this.compareAndSwapInt(obj, offset, current, current delta)); return current; }整个过程不断循环直到CAS成功才退出。value字段被volatile修饰保证了可见性使得每次读取都能获取到最新的值。四、CAS在Java中的应用CAS是Java并发包JUC的基石它的身影无处不在应用场景典型类说明原子类AtomicInteger、AtomicLong、AtomicReference通过CAS实现线程安全的单变量操作高性能计数器LongAdder采用分段累加思想将热点分散减少CAS冲突并发集合ConcurrentHashMap初始化桶、更新计数器时使用CAS同步器ReentrantLock、Semaphore、CountDownLatchAQSAbstractQueuedSynchronizer的state状态通过CAS维护五、CAS的三大挑战与解决方案任何技术都不是银弹CAS也存在一些固有的缺陷需要我们在使用时加以注意。1. ABA问题问题描述一个变量的值从A变为B又从B变回A。此时CAS检查时发现值仍为A就会误认为没有被修改过从而执行更新。在某些业务场景如栈操作、银行转账中这种“中间过程”可能导致严重错误。解决方案引入版本号或时间戳。Java提供了AtomicStampedReference它在比较时同时检查“值”和“版本号”只有两者都匹配才更新。AtomicStampedReferenceString ref new AtomicStampedReference(A, 1); // 同时比较值和版本号 ref.compareAndSet(A, B, 1, 2);2. 循环时间长开销大自旋消耗CPU问题描述CAS通常配合自旋无限循环使用。在高并发下大量线程同时争抢一个变量频繁失败重试会导致CPU占用率飙升。解决方案限制自旋次数超过一定次数后使用其他策略如直接阻塞。使用LongAdder等分段累加工具将单点竞争分散到多个Cell上减少冲突。JVM自适应自旋在锁升级中应用根据历史成功率动态调整自旋次数。3. 只能保证一个共享变量的原子操作问题描述CAS一次只能对一个内存地址进行原子操作如果需要同时更新多个变量则无法保证原子性。解决方案将多个变量封装成一个对象使用AtomicReference进行原子更新。使用传统的锁synchronized或ReentrantLock保护临界区。六、CAS vs synchronized如何选择对比维度CASsynchronized实现方式CPU原子指令无锁Monitor互斥锁线程状态失败则自旋不阻塞失败则阻塞挂起唤醒开销大适用场景低竞争、单变量简单操作高竞争、多变量复杂逻辑可重入性不支持需自行封装支持性能特点无竞争时极快高竞争时自旋消耗CPU低竞争时一般高竞争时性能下降但可控选择建议对于简单的计数器、状态标记优先使用AtomicInteger、LongAdder等。对于复杂的临界区、多变量操作或需要wait/notify通信时使用synchronized或ReentrantLock。实际开发中通常优先使用JUC提供的高级工具避免手写CAS逻辑。七、总结CAS作为并发编程中的一项关键技术用无锁的方式实现了线程安全的变量更新极大地提升了系统在低竞争场景下的性能。它的实现依赖于CPU指令和JVM底层的Unsafe类为Java提供了强大的无锁并发能力。但同时我们也要清醒地认识到CAS并非万能——ABA问题、自旋开销和单变量限制是它的三大软肋。只有在合适的场景下合理使用才能扬长避短写出高效、可靠的并发代码。从synchronized到CAS再到LongAdder和CompletableFutureJava并发的演化史正是一部不断追求性能和易用性的历史。理解CAS就是理解了现代Java并发编程的基石

相关文章:

Java并发——CAS(比较并替换)

在多线程编程中,如何安全地修改共享变量是永恒的课题。传统的synchronized关键字虽然保证了线程安全,但基于互斥锁的机制会导致线程阻塞、上下文切换,在竞争激烈的场景下可能成为性能瓶颈。于是,一种更轻量的同步方案——CAS&…...

Crypto Trading Bot 交易所集成详解:Bitmex、Binance、Bybit 实战指南

Crypto Trading Bot 交易所集成详解:Bitmex、Binance、Bybit 实战指南 【免费下载链接】crypto-trading-bot Cryptocurrency trading bot in javascript for Bitfinex, Bitmex, Binance, Bybit ... (public edition) 项目地址: https://gitcode.com/gh_mirrors/cr…...

避坑指南:Windows下用llama.cpp部署DeepSeek量化模型遇到的7个典型报错

避坑指南:Windows下用llama.cpp部署DeepSeek量化模型遇到的7个典型报错 在Windows平台上部署量化模型时,开发者常常会遇到各种意想不到的问题。本文将基于真实踩坑经历,详细解析7个典型报错及其解决方案,帮助开发者快速定位并解决…...

实战指南:主流图像篡改检测数据集深度解析与应用

1. 图像篡改检测数据集的重要性与挑战 在数字图像处理领域,图像篡改检测技术正变得越来越重要。随着Photoshop等图像编辑工具的普及,任何人都能轻松修改图片内容。从社交媒体上的虚假新闻到法庭上的证据伪造,篡改图像带来的问题已经渗透到我们…...

用PPO算法搞定机器人仿真参数调优:从零到一的Isaac Gym实战指南

用PPO算法搞定机器人仿真参数调优:从零到一的Isaac Gym实战指南 在机器人仿真开发中,参数调优一直是个令人头疼的问题。想象一下,你花了几周时间搭建了一个完美的机器人模型,却发现它在仿真环境中的表现和预期相差甚远——关节太僵…...

声音克隆黑科技!用Fish Speech 1.5上传5秒音频,克隆你的专属语音

声音克隆黑科技!用Fish Speech 1.5上传5秒音频,克隆你的专属语音 1. 引言:你的声音也能被克隆? 想象一下,你只需要录制5秒钟的语音,就能让AI学会你的声音特点,然后用你的声音说出任何你想说的…...

Phi-4-mini-reasoning在Linux环境下的部署与优化指南

Phi-4-mini-reasoning在Linux环境下的部署与优化指南 1. 开篇:为什么选择Phi-4-mini-reasoning 如果你正在寻找一个既轻量又强大的推理模型,Phi-4-mini-reasoning绝对值得关注。这个只有3.8B参数的小模型,在数学推理和逻辑分析任务上的表现…...

Nanbeige4.1-3B详细步骤:transformers>=4.51.0兼容性验证与避坑指南

Nanbeige4.1-3B详细步骤:transformers>4.51.0兼容性验证与避坑指南 最近在部署一个挺有意思的小模型——Nanbeige4.1-3B。别看它只有30亿参数,但在推理、代码生成这些任务上表现相当亮眼。不过,我在实际部署时遇到了一个关键问题&#xf…...

路径规划地图表示终极指南:5分钟搞懂两种核心方法如何选型

路径规划地图表示终极指南:5分钟搞懂两种核心方法如何选型 【免费下载链接】PathPlanning Common used path planning algorithms with animations. 项目地址: https://gitcode.com/gh_mirrors/pa/PathPlanning 路径规划是机器人导航、自动驾驶等领域的核心技…...

血浆蛋白质组学在46,165名成人中识别出与发作抑郁相关的蛋白质和通路

论文总结1、识别出与抑郁症发病相关的血浆蛋白质特征,明确了其与抑郁症发病风险的关联模式(正向/负向关联)2、通过MetaSpace和Cytoscape (v3.10.2)解析相关蛋白质涉及的生物学通路(GO,KEGG),通过孟德尔随机…...

MogFace效果展示:精准识别水墨画中抽象人脸,看AI如何理解艺术

MogFace效果展示:精准识别水墨画中抽象人脸,看AI如何理解艺术 1. 引言:AI与水墨艺术的跨时空对话 水墨画作为中国传统艺术的精髓,以其独特的写意风格和留白意境闻名于世。画家们常常通过寥寥数笔勾勒人物神韵,这种高…...

ArcMap拓扑检查保姆级教程:从创建地理数据库到错误导出,一步不落

ArcMap拓扑检查全流程实战指南:从数据准备到错误修正 在地理信息系统(GIS)数据生产过程中,拓扑检查是确保数据质量的关键环节。无论是土地确权、管线网络还是城市规划数据,拓扑错误都可能导致分析结果偏差甚至决策失误…...

Anaconda环境下Shadow Sound Hunter模型开发环境搭建

Anaconda环境下Shadow & Sound Hunter模型开发环境搭建 最近有不少朋友在尝试运行一些有趣的AI模型时,被环境配置搞得头大。尤其是像Shadow & Sound Hunter这类结合了视觉和音频处理的模型,依赖库又多又杂,版本冲突是家常便饭。今天…...

ZeroTier进阶指南:基于Docker的自建PLANET与Controller部署实战

1. 为什么需要自建ZeroTier基础设施 当你使用ZeroTier组建虚拟局域网时,所有节点默认都会连接到官方运营的PLANET根服务器。这个设计虽然方便,但在实际使用中会遇到几个明显问题。首先是延迟问题,由于官方服务器都部署在海外,国内…...

YOLO12惊艳效果:强反射玻璃幕墙中人物与车辆穿透式检测

YOLO12惊艳效果:强反射玻璃幕墙中人物与车辆穿透式检测 1. 技术背景与挑战 在现代城市环境中,玻璃幕墙建筑已经成为主流设计元素。这些闪亮的玻璃表面虽然美观,却给计算机视觉系统带来了巨大挑战。强反射、光线干扰、镜像效应等问题&#x…...

RMBG-2.0行业落地:教育机构课件配图、MCN机构短视频封面批量去背实操

RMBG-2.0行业落地:教育机构课件配图、MCN机构短视频封面批量去背实操 1. 引言:当“抠图”不再是设计师的专属技能 想象一下这个场景:一位中学老师正在准备下周的生物课课件,需要一张清晰的青蛙解剖图作为配图。她在网上找到了一…...

单片机烧录全流程实战:UART/ST-LINK/SWD工具链详解

1. 单片机开发实践入门:从烧录工具链到工程落地的完整闭环单片机课程长期存在一个显著悖论:它被定义为一门以硬件交互、外设驱动和实时控制为核心的实践性技术课程,但在实际教学与自学路径中,却普遍演变为汇编指令背诵、寄存器位定…...

移动机器人路径规划这事儿吧,光靠传统算法是真费劲。今天咱们聊聊怎么用Q-learning让机器人自己学会找路,MATLAB代码实操走起

机器人路径优化:基于强化学习Q-learning算法的移动机器人路径优化MATLAB先整一个5x5的网格环境,障碍物直接用矩阵标记。看这段初始化代码: grid_size [5,5]; start [1,1]; goal [5,5]; obstacles [2,2;3,3;4,4]; q_table zeros(prod(gr…...

YOLO26目标检测实战:官方镜像一键部署,轻松实现图片视频检测

YOLO26目标检测实战:官方镜像一键部署,轻松实现图片视频检测 1. 为什么选择YOLO26官方镜像? YOLO26作为目标检测领域的最新成果,在精度和速度上都有了显著提升。但对于大多数开发者来说,从零开始搭建YOLO26的开发环境…...

Qwen-Ranker Pro应用场景:跨境电商商品描述跨语言语义匹配

Qwen-Ranker Pro应用场景:跨境电商商品描述跨语言语义匹配 1. 引言 你有没有遇到过这样的问题?在跨境电商平台上,用中文搜索“防水运动手表”,结果出来的商品描述里,英文写着“waterproof sports watch”&#xff0c…...

Qwen3-32B+Clawdbot部署教程:基于Linux服务器的生产环境完整配置

Qwen3-32BClawdbot部署教程:基于Linux服务器的生产环境完整配置 1. 引言:为什么需要私有化部署大模型聊天平台? 想象一下这个场景:你的团队需要一个智能助手来处理内部文档、回答技术问题,甚至辅助代码编写。但使用公…...

SiameseUIE部署教程:小内存实例中模型加载与推理内存占用优化

SiameseUIE部署教程:小内存实例中模型加载与推理内存占用优化 1. 为什么在小内存实例上部署SiameseUIE是个挑战? 你有没有试过在一台只有4GB内存、系统盘不到50G的云服务器上跑信息抽取模型?刚解压模型权重就提示磁盘空间不足,p…...

探索NEU - DET数据集:表面缺陷检测的宝库

NEU-DET数据集包含了六种主要的表面缺陷类别,包括:缺陷、涂层剥落、油污、锈蚀、划痕和水印。 每种类型缺陷各300个样本,总共1800张灰度图像,每张图像原始分辨率为200*200像素。 其中训练集为1620张,测试集为180张。 对…...

5分钟搞定translategemma-12b-it部署:本地化图文翻译不求人

5分钟搞定translategemma-12b-it部署:本地化图文翻译不求人 1. 为什么你需要一个能“看懂”图片的翻译工具? 想象一下这个场景:你收到一份英文的产品说明书PDF,里面全是图表和带文字的截图。你打开翻译软件,发现它只…...

锂电池全自动裁切喷码机项目技术分享

三菱FX5U程序,双FX5U80MT主从站控制,普洛菲斯触摸 屏程序,搭配三菱伺服,松下变频器控制运动控制数轴运动控制。 FX5-485ADP模块通信应用控制,以太网通信应用控制 锂电池全自动裁切喷码机 多工位转盘控制分类&#xff…...

Mockito5.x进阶指南:JUnit5中如何优雅测试线程池和静态方法

Mockito 5.x进阶指南:JUnit5中如何优雅测试线程池和静态方法 单元测试是保障代码质量的重要手段,而Mockito作为Java生态中最流行的测试框架之一,在5.x版本中带来了诸多强大特性。本文将深入探讨如何利用Mockito 5.x在JUnit5环境下解决两个最具…...

乙巳马年春联生成终端惊艳效果:与智能音箱联动语音唤起‘开门见喜’指令

乙巳马年春联生成终端惊艳效果:与智能音箱联动语音唤起‘开门见喜’指令 想象一下,你正和家人围坐在一起,准备迎接新年。你对着家里的智能音箱说:“小爱同学,开门见喜。” 话音刚落,客厅的电视或电脑屏幕上…...

RMBG-2.0在SpringBoot项目中的集成实践:Java开发指南

RMBG-2.0在SpringBoot项目中的集成实践:Java开发指南 1. 开篇:为什么选择RMBG-2.0做智能抠图 如果你正在开发需要图像处理功能的Java应用,特别是需要智能抠图、背景去除的场景,那么RMBG-2.0绝对值得你关注。这个由BRIA AI团队开…...

联邦学习赋能推荐系统:架构演进、隐私挑战与未来展望

1. 联邦学习如何重塑推荐系统 记得三年前我在做一个电商推荐项目时,遇到个头疼的问题:用户数据分散在不同平台,想整合又怕触碰隐私红线。当时我们团队尝试了各种数据脱敏方案,结果模型效果直线下降。直到接触了联邦学习&#xff0…...

别再为并行计算发愁!手把手教你用VS2022搞定OpenMP和MPI环境(Windows版)

现代并行计算实战:VS2022高效配置OpenMP与MPI全指南 在数据密集型计算和科学模拟领域,并行计算已成为突破单机性能瓶颈的核心技术。微软Visual Studio 2022作为Windows平台最强大的集成开发环境,其对OpenMP和MPI的原生支持让开发者能够快速构…...