CAS乐观锁的原理

​之前看过CAS乐观锁的实现方式,最近又遇到了看见了cas,但是想不起来是怎么回事,想想没有当时没有完全消化,这次查看了网上的博客介绍,整理了这篇文章

CAS乐观锁是什么(Compare and swap)

并发编程中,锁是很消耗性能的操作,在取数据比较多的情况下,为了节约资源,我们可以采取先取值并操作再判断的方法,由于这个方法取值前不判断是否有其他线程是否在同时操作,所以被称为乐观锁。详情如下

A线程想操作x变量的时候会先取出x的值,然后对变量进行自增或者其他操作,操作完后判断x变量现在这一时刻的值是否和之前取出的值相同,如果相同,就将操作后的数赋值给x;如果不相同,代表在自增的时候有B线程对x进行了操作,A线程操作失败,此时A线程重新执行取值,自增判断的操作,直到成功(这个过程称为自旋)

此时,还有一个问题。如果在判断A线程在判断x变量没有被改变后的瞬间有线程改变了x怎么办?

CAS是一种系统原语(所谓原语属于操作系统用语范畴。原语由若干条指令组成的,用于完成一定功能的一个过程。primitive or atomic action 是由若干个机器指令构成的完成某种特定功能的一段程序,具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断)CAS是Compare And Set的缩写。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性

所以不会出现上述的情况。

CAS优点

非阻塞的轻量级的乐观锁,通过CPU指令实现,在资源竞争不激烈的情况下性能高,相比synchronized重量锁,synchronized会进行比较复杂的加锁,解锁和唤醒操作。

CAS缺点

(1)ABA问题 线程C、D,线程D将A修改为B后又修改为A,此时C线程以为A没有改变过,java的原子类AtomicStampedReference,通过控制变量值的版本来保证CAS的正确性。
(2)自旋时间过长,消耗CPU资源, 如果资源竞争激烈,多线程自旋长时间消耗资源。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值