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

【并发编程基石】CAS无锁算法详解:原理、实现与应用场景

一、什么是CAS?

CAS(Compare-And-Swap) 是现代并发编程的核心算法之一,它通过处理器指令级的原子操作实现线程安全,无需传统锁机制。其核心逻辑可以用一个公式表示:

CAS(V, E, N) {if (V == E) {  // 比较当前值是否等于预期值V = N      // 如果相等则更新return true}return false
}

二、CAS的工作原理

  1. 读取共享变量V(假设值为A)
  2. 计算新值B
  3. 提交时检查:如果V仍等于A,则更新为B;否则重试或放弃

三、Java中的CAS实现

3.1 Atomic原子类示例

AtomicInteger count = new AtomicInteger(0);// 线程安全的递增
count.incrementAndGet(); // 源码实现(JDK17)
public final int incrementAndGet() {return U.getAndAddInt(this, VALUE, 1) + 1;
}

3.2 Unsafe类底层调用

// HotSpot虚拟机实现
UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x))
{oop p = JNIHandles::resolve(obj);jint* addr = (jint*)index_oop_from_field_offset_long(p, offset);return Atomic::cmpxchg(x, addr, e) == e;
}

四、CAS的典型应用场景

4.1 并发计数器

// 传统锁方案 vs CAS方案
synchronized void increment() {  // 悲观锁count++;
}void increment() {               // 乐观锁int old;do {old = count.get();} while (!count.compareAndSet(old, old+1));
}

4.2 无锁队列(ConcurrentLinkedQueue)

// JDK实现片段
Node<E> newNode = new Node<E>(e);
while (true) {Node<E> t = tail;if (t.casNext(null, newNode) && casTail(t, newNode)) {return true;}
}

五、CAS的优缺点分析

优势

  • 高性能:避免线程上下文切换
  • 无死锁:不存在锁的循环等待
  • 细粒度:变量级别的并发控制

缺陷

问题类型说明解决方案
ABA问题值从A→B→A变化导致误判使用AtomicStampedReference
自旋开销长时间竞争浪费CPU限制自旋次数或升级为锁
单一变量只能保证单个变量原子性使用AtomicReference

六、CAS在分布式系统中的变种

6.1 乐观锁实现

UPDATE products 
SET stock = stock - 1, version = version + 1 
WHERE id = 100 AND version = 5

6.2 Redis的WATCH/MULTI

WATCH stock_key
MULTI
DECR stock_key
EXEC

七、最佳实践建议

  1. 短平快操作:CAS适合简单的原子操作
  2. 低竞争场景:高竞争时考虑LongAdder
  3. 版本号机制:重要数据添加时间戳/版本号
  4. 失败策略:设置合理的重试次数上限

相关文章:

  • Docker环境下的Apache NiFi安装实践踩坑记录
  • 设计模式系列(02):设计原则(一):SRP、OCP、LSP
  • milvus+flask山寨《从零构建向量数据库》第7章case2
  • 加速AI在k8s上使用GPU卡
  • swift flask python ipad当电脑键盘 实现osu x键和z键 长按逻辑有问题 quart 11毫秒
  • Java鼠标事件监听器MouseListener、MouseMotionListener和MouseWheelListener
  • 一文理清人工智能,机器学习,深度学习的概念
  • Trae IDE:AI深度集成的智能开发环境
  • 序列化和反序列化(hadoop)
  • 鸿蒙next播放B站视频横屏后的问题
  • Web Service及其实现技术(SOAP、REST、XML-RPC)介绍
  • API安全
  • 【Redis】谈谈Redis的设计
  • 【unity游戏开发——编辑器扩展】使用MenuItem自定义菜单栏拓展
  • 【计算机视觉】OpenCV实战项目:基于OpenCV的车牌识别系统深度解析
  • Excel的详细使用指南
  • MySQL初阶:查询进阶
  • Unity基础学习(十三)核心系统—物理系统之碰撞检测组件篇(2)刚体,碰撞体,材质
  • 前端学习(3)—— CSS实现热搜榜
  • OAuth安全架构深度剖析:协议机制与攻防实践
  • 耗资10亿潮汕豪宅“英之园”将强拆?区政府:非法占用集体土地
  • 在笔墨金石间,看胡问遂与梅舒适的艺术对话
  • 从这些电影与影像,看到包容开放的上海
  • 英媒:英国首相住所起火,目前无人伤亡
  • 全球前瞻|特朗普访问中东三国,印巴军方将于12日再次对话
  • 印度证实印巴已同意停火