Java高并发基础之CAS

CAS是什么

CAS全称为Compare and Swap,又或者被称为 Compare and exchange,直译过来就是比较与交换,其功能是实现了线程安全的数值的递增。

CAS的工作流程

众所周知,通过i++而进行的数值的递增,由于递增不是原子性操作,在并发情况下会导致错误,从而是线程不安全的。CAS实现了线程安全的数值递增,是如何实现的呢?其流程如下图:
CAS流程
CAS是在对数值递增时,获取到需要进行操作的数E,然后计算数值递增后的结果V,之后再取即将更新值N与E进行对比。若相等,就将值更新为V;若不相等,再进行这次操作循环,直至实现递增,从而结束。
CAS为什么是线程安全?假如在这个线程刚将N于E进行比较且得到结果相等之后,在将其值修改之前有另一个线程将该值修改了,这样不就是线程不安全的吗?
在底层CAS的操作是对应一个底层lock comxchg指令。comxchg指令即compare and exchange,但是这条指令并不是原子性的,lock指令的作用是在执行后面的指令的时候锁定一个北桥信号,这又可以被称为内存屏障。就是为了保障在它进行比较和替换的过程中不会别的线程对其操作。

ABA问题

ABA问题,首先直接来看ABA,从A变成B再又变成A,即在对新老数值进行对比之前,已经有别的线程对值进行修改多次但是值没发生变化,会导致CAS认为其没有发生变化。对于这个问题,可以通过对其添加版本号,在比较数值的同时进行版本号的比较,从而去确定是否被修改过。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值