CAS操作

CAS(Compare and Swap)是并发编程中用于保证数据原子性的一种机制,通过CPU原子指令实现。它包含内存位置、预期原值和新值三个操作数,只有当内存位置的值与预期原值相同时才会更新。然而,CAS存在循环时间长导致的开销大问题,以及ABA问题,即值在比较和更新间被改变。解决ABA问题的一种方法是引入版本号。本文探讨了CAS的原理、缺陷及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

CAS是compare and swap(比较并交换)的缩写,在并发算法时用来保证更新数据原子性的操作,本质是一条CPU原子指令,不会造成所谓的数据不一致问题,Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg;

执行cmpxchg指令时,会判断当前系统是否为多核系统,若是的话会给总线加锁,只有一个线程会对总线加锁成功,加锁后执行cas操作。

简介

CAS包含三个操作数:内存位置原值(A)、预期原值(B)及要更新值(C);

执行CAS操作时,将内存位置的值(A)与预期原值(B)比较,若匹配,处理器会将内存位置的值更新为新值(若A = B,则A —>C),若不匹配,则处理器不做任何操作;多个线程同时执行CAS操作时只有一个会成功去,其他不成功的线程可以重新不断尝试CAS(这种情况叫做 自旋)或是放弃更新。

原理

CAS算法实现是比较当前内存位置值A与预期当前位置值B是否相同,从而判断当前要修改的位置是否被其他线程修改过了的方式来保证修改操作的原子性。

存在的缺陷

循环时间长——开销大

底层源码中,若是CAS失败,会一直自旋尝试,若是CAS长时间不成功,可能给CPU带来很大的开销;

ABA问题

使用CAS算法,可能会出现线程1、2同时进行CAS操作,线程1极其快的将原内存值A修改为B,紧接着线程3也进行CAS操作,抢在线程2前将内存原值从B改回A,接着线程2进行了CAS操作,发现内存原值与他的预期值一致是A,固也操作成功了,此时就出现了ABA问题,不能够保证数据的原子性。

 解决ABA问题的方法

带上版本号:在每次修改操作后都将版本号+1,在对比内存原值时将版本号也进行比对,都相同才进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值