什么是CAS?

4 篇文章 0 订阅
2 篇文章 0 订阅

1.什么是CAS?
CAS的全称是Compare-And-Swap,是一条CPU并发原语。
它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。
通俗的解释是:

比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较知道主内存和工作内存中的值一致为止。

2.CAS应用

CAS有三个操作数:内存值V,旧的预期值A,要修改的更新值B
当且仅当预期值A和内存值V相同,将内存值V修改为B,否则什么都不做。

3.CAS为什么能保证原子操作呢?

CAS底层用到的Unsafe类,Unsafe是CAS的核心类,Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Usafe相当于一个后门,基于该类可以直接操作特定内存的数据。Unsafe类存在于sun.misc包中,其内部方法操作可以像C语言的指针一样直接操作内存,Java中CAS操作的执行依赖于Unsafe类的方法。
4.CAS调用层次
java:Unsafe类
Native:CompareAndSwapInt
atomic_linux_x86
asm LOCK_IF_MP( Multi Processor)(多核lock)
lock cmpxchg 指令
硬件:
lock指令在执行后面指令的时候锁定一个北桥信号
(不采用锁总线的方式)
在这里插入图片描述

CAS机制是乐观锁(相对于synchronized)
CAS是自旋锁或者无锁,在此过程中运用了CPU的CAS指令及JNI(Java Native Interface)对底层操作修改变量

乐观锁认为对一个对象的操作不会引发冲突,所以每次操作都不进行加锁,只是在最后提交更改时验证是否发生冲突,如果冲突则再试一遍,直至成功为止,这个尝试的过程称为自旋

5.CAS存在的问题

  • ABA问题。因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A - 2B-3A。

  • 循环时间长开销大。自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令那么效率会有一定的提升,pause指令有两个作用,第一它可以延迟流水线执行指令(de-pipeline),使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order violation)而引起CPU流水线被清空(CPU pipeline flush),从而提高CPU的执行效率。

6.ABA问题怎么解决?
从Java1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,
你可以把多个变量放在一个对象里来进行CAS操作.
AtomicReference.compareAndSet()
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值