CAS锁机制

一、什么是CAS?

在这里插入图片描述

Compare And Swap,比较并交换

在修改值之前,先比较一下值有没有被别人修改。

update table set column = #{newValue} where id = #{id} and column = #{oldValue}

在这里插入图片描述

二、CAS优点

  1. 无锁(synchronized),无需切换线程,竞争CPU时间片
  2. 轻量级,适用于并发量不高,多核CPU的场景

三、CAS缺点

  1. ABA问题

我在修改前,别人偷偷修改了并且又改回了原始值,我比较就通过了,即无法感知别人的修改。

在这里插入图片描述

  1. 自旋开销问题

在高并发下,可能会一直自旋,长时间占用CPU资源

  1. 共享变量单一问题

只能保证单个共享变量的原子性,不能保证多个共享变量,或者代码块

四、AtomicInteger等原子类(JUC并发包)

volatile + CAS

  1. volatile保证内存可见性。
  2. sun.misc.UnSafe类通过一系列用C/C++实现的本地方法操作CPU指令实现CAS。

通过成员变量的内存偏移量,直接读取或设置该成员变量的值(详见《OOP-Klass HotSpot对象模型》)

在这里插入图片描述
在这里插入图片描述

compareAndSwapInt(Object o, long offset, int expect, int update)

  1. 读取传入对象o在内存中偏移量为offset位置的值与期望值expect作比较。
  2. 相等就把update值赋值给offset位置的值,方法返回true
  3. 不相等,就取消赋值,方法返回false

五、CAS使用事项

  1. ABA问题

增加版本号

数据库:

update table set column = #{value}, version = version + 1 where id = #{id} and version = #{oldVersion}

Java:

java.util.concurrent.atomic.AtomicStampedReference

在这里插入图片描述

在这里插入图片描述

  1. 共享变量单一问题
java.util.concurrent.atomic.AtomicReference

把多个成员变量组成一个对象,更新整个对象

在这里插入图片描述
在这里插入图片描述

AtomicintegerAtomicBoolean原理是一样的,只不过AtomicIntegerAtomicBoolean底层调用的是unsafe.compareAndSwapInt方法CAS操作int的值,而这里是compareAndSwapObject是CAS操作一个内存对象而已

在这里插入图片描述

  1. 循环时间长开销很大问题

在这里插入图片描述

另外,也可以通过代码控制,循环达到一定次数,就结束循环,并返回提示用户”操作失败,请稍后重试~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex·Guangzhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值