讲师中心 微信公众号
AI工具推荐 视频效率加速

如何理解CAS无锁算法与Atomic原子类在JUC的应用

云伟小哥_5409

云伟小哥_5409

发布时间:2026-04-01 15:03:15

|

507人浏览过

|

来源于php中文网

原创

CAS不是锁,而是依赖CPU原子指令(如cmpxchg)实现的无锁并发控制,需配合volatile保证可见性,失败时通过重试而非阻塞来处理竞争,适用于低冲突场景。

如何理解cas无锁算法与atomic原子类在juc的应用

为什么 CAS 不是“锁”却能保证线程安全

CAS 本质是一条 CPU 原子指令(比如 x86 上的 cmpxchg),不是 Java 层面的锁机制,也不进内核态。它靠硬件保证“比较+写入”这一步不可拆分——哪怕多个线程同时执行 compareAndSwapInt,也只会有一个成功,其余失败后立刻返回,不挂起、不阻塞、不切换上下文。

关键在于:它必须搭配 volatile 字段使用。否则线程可能一直读到自己工作内存里的旧值,导致预期值 E 永远不变,CAS 永远失败或永远“误成功”。volatile 强制每次读都从主内存拉最新值,写完立刻刷回主内存,这是 CAS 能工作的前提。

  • 没加 volatile 的字段上用 AtomicInteger?行为未定义,大概率出错
  • CAS 失败不等于出错,而是告诉你“值被别人改了”,得你自己决定重试还是放弃
  • 高竞争下自旋开销明显,CPU 白跑循环;线程数远超 CPU 核心数时,性能反而不如 synchronized

AtomicInteger.getAndIncrement() 底层到底在干什么

调用 getAndIncrement() 时,JVM 实际执行的是 Unsafe.getAndAddInt():先用 getIntVolatile() 读当前值 V,再用 compareAndSwapInt(obj, offset, V, V + 1) 尝试更新。失败就重试,直到成功为止。

这个过程没有锁对象、没有 monitor entry、不触发线程调度——但它是“乐观”的:假设冲突少,靠重试兜底。所以适合计数器、状态标志位这类低竞争、单变量、操作快的场景。

  • 不要在循环里反复调用 getAndIncrement() 做大量累加——每次都是独立 CAS,失败重试成本叠加
  • 想批量加 100?别写 100 次 incrementAndGet(),用 addAndGet(100) 一次到位
  • lazySet() 和 set() 都写值,但前者不保证后续读的可见顺序,仅适用于“只写不读”的发布场景(如链表尾指针更新)

ABA 问题不是理论陷阱,是真实会崩掉逻辑的 Bug

线程 A 读到值 A,准备 CAS 成 B;此时线程 B 把 A → B → A 改了两轮;A 再执行 CAS 时发现还是 A,就直接写入——但语义已错:中间状态丢失了。

典型例子是并发栈的 pop 操作:头节点被弹出又压回同个对象,CAS 认为“没变”,实际栈结构已被破坏。

  • 用 AtomicStampedReference 加版本号,每次修改 stamp +1,CAS 变成“值+版本”双校验
  • 用 AtomicMarkableReference 加一个布尔标记位,适合只需要区分“是否被改过”的轻量场景
  • 别自己用 long 拼戳记——高位存版本、低位存引用,容易因 GC 移动对象地址而失效(Java 9+ 后 Unsafe.objectFieldOffset 对压缩指针有兼容性风险)

Unsafe 类为什么“危险”,又为什么绕不开

sun.misc.Unsafe 是 JUC 原子类的底层引擎:所有 compareAndSwapXXX、putObjectVolatile、objectFieldOffset 都依赖它。但它绕过 JVM 安全检查,可直接读写内存地址、强制实例化抽象类、甚至篡改 final 字段。

Java 9 开始模块化后,默认禁止应用代码反射访问 Unsafe;Java 17 更进一步限制其部分方法。但 JUC 内部仍通过特权块调用——你写业务代码不该碰它,但得知道 Atomic 类背后是它在扛。

  • 别在应用里 try-catch PrivilegedActionException 去硬取 Unsafe 实例,JDK 版本一升级就挂
  • VarHandle(Java 9+)是官方推荐替代方案,API 更安全、语义更清晰,但目前 Atomic 类还没全面迁过去
  • 看到堆栈里出现 Unsafe.compareAndSwapInt 不用慌——那是正常路径;但如果自己代码里出现了,基本可以删了

真正难的从来不是“怎么调用 incrementAndGet”,而是判断该不该用它、值被谁改过、失败后要不要等、以及当多个字段要一起变时——CAS 已经帮不上忙了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

11617

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

8722

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7492

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1244

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

988

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1476

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

3049

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20311

2023.08.03

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn