CAS机制的原理到底是什么?

CAS
说起CAS,这当然有的小伙伴可能学过开源项目CAS单点登录的实现。这可不是那个CAS,这里说的是CAS机制。
CAS有三个值 原始地址V值 旧的预期值A 新的值B
CAS是乐观锁原理实现的。
比如要给一个属性+1操作 假设V值是10
这个时候线程1 登场了 ,首先他会先存一个旧的预期值A 也就是10 。然后计算一个新值B =A+1=11。
这个时候有一个坏蛋线程2,它提前一步对V值修改了把V值修改成11了。
这个时候问题就来了。线程一要先把旧的预期值和V值进行比较,如果它俩相等才能把线程1的B值赋给V
可是另线程1苦恼的问题是,谁动了我的奶酪?咋不一样了呢?
好吧 线程1经过一番苦恼,终于接受了这样一个现实,那么线程1该怎么办呢?这就引出了一个新的关键字“ 自旋”,
啥是自旋呢? 那就是再来一圈,再把新的V值当做 线程1的A(旧的预期值) 线程1的B=A+1=11+1=12.
此时线程1的B值等于12。再想对V值赋值时 再把A值和V值相比较,如果这个时候线程2那个小子没搞破坏,其他的线程也没来告破坏,那么理论上v=A ,OK? OK了之后 就把B值赋值给V 最终实现把V值改成了完成了+1。
如果这个过程中还是有线程对其破坏那么它仍然会自旋。这个问题咋解决呢?给它加同步锁。

还有一个问题?
ABA问题?
高并发情况下,假设有三个线程。并发1获取出的初始值是A,后续计划实施CAS乐观锁,期望数据仍是A的时候,才能修改成功。
并发2:将数据修改成B
并发3:将数据修改回A
并发1 :CAS乐观锁检查到V仍然是等于A 但是已经不是以前那个数据了。这就是CAS引发的ABA问题。

猜你喜欢

转载自blog.csdn.net/weixin_43848065/article/details/88093240