news 2026/5/13 19:08:15

CAS和Atomic原子操作类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CAS和Atomic原子操作类

一、基本概念

CAS是一种原子操作,用于实现无锁并发编程,是乐观锁的实现方式之一。

它包含三个操作数:

  • 内存位置 V(需要读写的变量)

  • 期望值 A(线程认为 V 当前应该有的值)

  • 新值 B(想要写入的新值)

核心逻辑

if (V的值 == A) { V的值 = B; 返回成功; } else { 返回失败; }

关键点:比较和交换是一个原子操作,由硬件指令保证(如x86的CMPXCHG

二、为什么需要CAS?

传统锁的问题

  • 线程阻塞/唤醒有上下文切换开销

  • 可能产生死锁、优先级反转等问题

CAS的优势

  • ✅ 无阻塞,不会挂起线程

  • ✅ 无锁开销,性能更高

  • ✅ 避免死锁

对比维度CAS(无锁)
线程阻塞不阻塞阻塞
上下文切换
适用场景低/中竞争,操作短高竞争,操作长
风险ABA、活锁、CPU空转死锁、优先级反转
性能竞争小时极快竞争大时稳定

三、CAS的三大问题及解决方案

问题1:ABA问题

场景:值从 A → B → A,CAS误认为没变化

解决方案:增加版本号/时间戳

// 带版本号的引用 AtomicStampedReference<String> ref = new AtomicStampedReference<>("A", 0); int[] stamp = new int[1]; String value = ref.get(stamp); // 获取值和版本号 // 更新时必须同时匹配值和版本号 boolean success = ref.compareAndSet( "A", "B", // 期望值,新值 stamp[0], stamp[0] + 1 // 期望版本,新版本 );

问题2:循环时间长开销大

现象:高竞争下CAS失败,线程一直自旋消耗CPU

解决方案

  • 限制自旋次数

  • 使用LongAdder(分段累加,最后汇总)

  • 退避策略(延迟重试)

问题3:只能保证一个共享变量的原子操作

解决方案

  • 将多个变量封装成对象,用AtomicReference

  • 使用锁(synchronized/ReentrantLock

四、Atomic原子操作类

java.util.concurrent.atomic包下的原子类,基于CAS实现的无锁、线程安全的操作类。

Atomic类分类

1. 基本类型

类名说明
AtomicInteger原子整型
AtomicLong原子长整型
AtomicBoolean原子布尔型

2. 数组类型

类名说明
AtomicIntegerArray原子整型数组
AtomicLongArray原子长整型数组
AtomicReferenceArray原子引用数组

3. 引用类型

类名说明
AtomicReference<V>原子引用
AtomicStampedReference<V>带版本号的引用(解决ABA
AtomicMarkableReference<V>带标记位的引用

4. 字段更新器

类名说明
AtomicIntegerFieldUpdater原子更新整型字段
AtomicLongFieldUpdater原子更新长整型字段
AtomicReferenceFieldUpdater原子更新引用字段

5. 累加器(JDK 1.8+)

类名说明
LongAdder高性能长整型累加器
DoubleAdder高性能双精度累加器
LongAccumulator自定义累加逻辑
DoubleAccumulator自定义累加逻辑

核心要点

  1. Atomic类基于CAS + volatile实现无锁并发

  2. 避免锁竞争,适合低/中并发场景

  3. 高竞争累加器用LongAdder性能更好

  4. 需要解决ABA问题用AtomicStampedReference

  5. 注意原子组合操作的危险

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 19:03:06

GraphSage的灵魂操作:在PyG里用NeighborLoader复现邻居采样全流程

GraphSage的灵魂操作&#xff1a;在PyG里用NeighborLoader复现邻居采样全流程 当面对社交网络、推荐系统或分子结构等图数据时&#xff0c;传统的全图训练方法往往遭遇显存瓶颈。GraphSage提出的邻居采样策略&#xff0c;如同为GNN训练装上了"内存调节阀"&#xff0c…

作者头像 李华
网站建设 2026/5/13 18:57:42

CTF SHOW WEB入门79

这是一道非常经典的 PHP 代码审计类 CTF 题目。该代码的核心在于文件包含漏洞 (LFI) 以及对特定关键词的黑名单绕过。 以下是详细的解题思路分析&#xff1a; 代码分析 代码逻辑非常简单直接&#xff1a; 获取参数&#xff1a;通过 $_GET[‘file’] 获取用户输入。 过滤机制&am…

作者头像 李华
网站建设 2026/5/13 18:55:06

基于Git工作流的OpenClaw状态备份工具clawsync设计与实践

1. 项目概述&#xff1a;为什么我们需要一个“Git原生”的备份工具&#xff1f;如果你和我一样&#xff0c;日常重度依赖 OpenClaw 这类现代化开发工具&#xff0c;那么一个挥之不去的痛点就是&#xff1a;状态管理。配置文件、工作区文件、凭据、会话……这些零散但又至关重要…

作者头像 李华
网站建设 2026/5/13 18:46:38

开发者技能工具箱:从Shell脚本到IaC,构建个人效率基础设施

1. 项目概述&#xff1a;一个面向开发者的技能工具箱最近在GitHub上看到一个挺有意思的项目&#xff0c;叫rohitg00/skillkit。光看名字&#xff0c;你可能会觉得有点抽象&#xff0c;但点进去之后&#xff0c;我发现这其实是一个开发者自己整理和维护的“个人技能工具箱”。它…

作者头像 李华