CAS 自旋锁实战:基于 AtomicReference 实现 3 种并发控制模式
基于 AtomicReference 的 CAS 自旋锁实战3 种高并发模式实现与性能对比在当今高并发的应用场景中锁机制的选择直接影响着系统性能。传统重量级锁虽然安全可靠但在高竞争环境下往往成为性能瓶颈。本文将带你深入探索基于AtomicReference的 CASCompare-And-Swap自旋锁实现通过三种不同模式的代码实战揭示无锁编程的核心原理与性能奥秘。1. CAS 核心原理与硬件支持CAS 是现代 CPU 提供的一种原子指令其操作过程可以简化为以下伪代码boolean CAS(address, expectedValue, newValue) { if (*address expectedValue) { *address newValue; return true; } return false; }关键点在于这个操作是硬件层面保证的原子性。在 x86 架构中这通过CMPXCHG指令实现配合LOCK前缀确保多核环境下的原子性。Java 的Unsafe类通过 JNI 调用这些底层指令而AtomicReference等原子类则是对这些操作的封装。CAS 与锁的本质区别锁采用阻塞策略获取不到锁的线程进入阻塞状态CAS 采用非阻塞策略线程不断重试直到成功自旋锁会引起线程上下文切换CAS 则避免了这种开销提示虽然 CAS 避免了线程阻塞但在高竞争环境下可能导致 CPU 空转需要根据场景权衡使用。2. 简单自旋锁实现我们先从最基本的自旋锁开始了解 CAS 在锁机制中的核心作用public class SimpleSpinLock { private final AtomicReferenceThread owner new AtomicReference(); public void lock() { Thread current Thread.currentThread(); // 自旋直到成功将 owner 从 null 设置为当前线程 while (!owner.compareAndSet(null, current)) { // 可加入 Thread.yield() 或短时 sleep 减少 CPU 消耗 } } public void unlock() { Thread current Thread.currentThread(); // 只有锁的持有者才能释放锁 owner.compareAndSet(current, null); } }性能测试数据10 线程竞争100 万次操作指标简单自旋锁synchronized耗时(ms)452678CPU 使用率90%60%上下文切换次数125,342从数据可以看出自旋锁在低竞争下性能优势明显但高竞争时 CPU 使用率飙升适合锁持有时间短的场景3. 可重入自旋锁实现简单自旋锁的一个明显缺陷是不支持重入这在实际应用中很不方便。我们通过记录重入次数来改进public class ReentrantSpinLock { private final AtomicReferenceThread owner new AtomicReference(); private int count 0; public void lock() { Thread current Thread.currentThread(); if (owner.get() current) { // 当前线程已持有锁增加重入计数 count; return; } // 自旋等待 while (!owner.compareAndSet(null, current)) { // 可优化为指数退避 } } public void unlock() { Thread current Thread.currentThread(); if (owner.get() ! current) { throw new IllegalStateException(Not the lock owner); } if (count 0) { count--; } else { owner.set(null); } } }ABA 问题解决方案 ABA 问题是 CAS 操作中的一个经典陷阱一个值从 A 变为 B 又变回 ACAS 会误认为没有变化。解决方案是引入版本号public class ABASafeReferenceT { private static class ReferenceT { final T value; final int version; Reference(T value, int version) { this.value value; this.version version; } } private final AtomicReferenceReferenceT ref new AtomicReference(new Reference(null, 0)); public boolean compareAndSet(T expect, T update) { ReferenceT current ref.get(); return ref.compareAndSet( current, new Reference(update, current.version 1) ); } }4. Treiber Stack无锁栈实现Treiber Stack 是最早提出的无锁数据结构之一展示了 CAS 在数据结构中的应用public class TreiberStackT { private static class NodeT { final T value; NodeT next; Node(T value) { this.value value; } } private final AtomicReferenceNodeT top new AtomicReference(); public void push(T item) { NodeT newNode new Node(item); NodeT currentTop; do { currentTop top.get(); newNode.next currentTop; } while (!top.compareAndSet(currentTop, newNode)); } public T pop() { NodeT currentTop; NodeT newTop; do { currentTop top.get(); if (currentTop null) return null; newTop currentTop.next; } while (!top.compareAndSet(currentTop, newTop)); return currentTop.value; } }性能对比10 线程100 万次操作操作无锁栈(ms)同步栈(ms)push287512pop265498混合操作3015435. 实战优化技巧在实际应用中我们可以采用以下策略优化 CAS 性能指数退避减少高竞争时的 CPU 消耗int backoff 1; while (!casOp()) { for (int i 0; i backoff; i) { Thread.yield(); } backoff Math.min(backoff * 2, MAX_BACKOFF); }缓存行填充避免伪共享Contended public class PaddedAtomicReferenceT extends AtomicReferenceT { // 自动添加缓存行填充 }批量操作减少 CAS 次数public class BatchCounter { private final AtomicLong global new AtomicLong(); private final ThreadLocalLong local ThreadLocal.withInitial(() - 0L); public void increment() { long count local.get() 1; local.set(count); if (count BATCH_SIZE) { global.addAndGet(count); local.set(0L); } } }6. 模式选择指南三种模式各有适用场景模式适用场景优点缺点简单自旋锁锁持有时间短竞争低实现简单性能好不支持重入可能饥饿可重入自旋锁需要递归调用的场景支持重入实现稍复杂Treiber Stack生产者-消费者模式无锁数据结构完全无锁扩展性好内存管理复杂在 Java 并发包中这些技术被广泛应用ConcurrentLinkedQueue基于类似 Treiber Stack 的思想ReentrantLock在低竞争时使用自旋优化AtomicXXX系列都基于 CAS 实现掌握这些底层技术不仅能帮助理解高级并发工具的原理还能在特定场景下实现更高性能的定制解决方案。

相关新闻

三步轻松复活经典游戏:DDrawCompat完整兼容性解决方案终极指南

三步轻松复活经典游戏:DDrawCompat完整兼容性解决方案终极指南

三步轻松复活经典游戏:DDrawCompat完整兼容性解决方案终极指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/d…

2026/7/11 13:30:58 阅读更多 →
猫抓浏览器扩展:终极资源嗅探与媒体捕获完整指南

猫抓浏览器扩展:终极资源嗅探与媒体捕获完整指南

猫抓浏览器扩展:终极资源嗅探与媒体捕获完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法下载网页视频而烦恼吗&…

2026/7/11 13:28:57 阅读更多 →
Fate/Grand Automata终极指南:如何轻松实现FGO自动化战斗

Fate/Grand Automata终极指南:如何轻松实现FGO自动化战斗

Fate/Grand Automata终极指南:如何轻松实现FGO自动化战斗 【免费下载链接】FGA Auto-battle app for F/GO Android 项目地址: https://gitcode.com/gh_mirrors/fg/FGA Fate/Grand Automata(简称FGA)是一款专门为《Fate/Grand Order》玩…

2026/7/11 13:28:57 阅读更多 →

最新新闻

3步快速上手:用ComfyUI-MimicMotionWrapper实现AI动作迁移

3步快速上手:用ComfyUI-MimicMotionWrapper实现AI动作迁移

3步快速上手:用ComfyUI-MimicMotionWrapper实现AI动作迁移 【免费下载链接】ComfyUI-MimicMotionWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-MimicMotionWrapper 想要让视频中的人物跳出专业舞者的动作,或者让动画角色完美复…

2026/7/11 14:13:18 阅读更多 →
经常跑线下采访的记者,智能笔记生成工具怎么选才好用

经常跑线下采访的记者,智能笔记生成工具怎么选才好用

2026年经常跑线下采访的记者,或是需要做访谈调研、整理课堂录音的学生,选智能笔记生成工具其实不用追热门瞎买,核心盯三个判断标准就行:第一是语音转写准确率够不够,能不能适配口音、专业术语;第二是能不能…

2026/7/11 14:09:17 阅读更多 →
重新发现XCOM 2模组管理:AML启动器的革命性架构解析

重新发现XCOM 2模组管理:AML启动器的革命性架构解析

重新发现XCOM 2模组管理:AML启动器的革命性架构解析 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/…

2026/7/11 14:07:17 阅读更多 →
北光恒电运维心得:泰克MSO58示波器常见故障排查与保养技巧

北光恒电运维心得:泰克MSO58示波器常见故障排查与保养技巧

泰克MSO58是5系列旗舰八通道混合信号示波器,凭借多通道同步测试、高带宽、高精度采样性能,广泛应用于新能源电控调试、车载电子开发、高速数字电路测试、工业精密设备检测等高端研发场景。八通道并行测试的优势,让它成为多信号同步分析的核心…

2026/7/11 14:07:17 阅读更多 →
StormScope-GOES-MRMS配置指南:轻松搭建你的高分辨率气象预测系统

StormScope-GOES-MRMS配置指南:轻松搭建你的高分辨率气象预测系统

StormScope-GOES-MRMS配置指南:轻松搭建你的高分辨率气象预测系统 【免费下载链接】stormscope-goes-mrms 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/stormscope-goes-mrms 想要快速搭建一个专业级的气象预测系统吗?StormScope-GOES-…

2026/7/11 14:05:17 阅读更多 →
3种方式用Fort Firewall解决Windows网络流量监控难题

3种方式用Fort Firewall解决Windows网络流量监控难题

3种方式用Fort Firewall解决Windows网络流量监控难题 【免费下载链接】fort Fort Firewall for Windows 项目地址: https://gitcode.com/GitHub_Trending/fo/fort 你是否曾经遇到过这样的场景:Windows系统后台某个应用突然开始疯狂上传下载,网络变…

2026/7/11 14:03:16 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻