码迷,mamicode.com
首页 > 其他好文 > 详细

CAS知识点总结

时间:2020-07-26 23:06:44      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:存在   本质   var   知识点   例子   需要   swa   cas   com   

乐观锁&悲观锁

在操作数据前认为不会有其他人修改数据即为乐观锁,始终认为有人会修改数据即为悲观锁

解决的问题

我们可以首先看一下自增++操作的底层

为了让a加上1,首先我们需要读取a,也就是让b=a,然后我们要让b加1,也就是b=b+1,然后我们把b赋给a所在地址。

这是整个自增操作的底层原理。

但是这三个操作实际上只有第三步是真正要修改数据的,因此为了提高效率,我们可以只给第三步加上锁,前两步可以不加,这就是CAS的底层操作。

CAS底层
while(!CompareAndSwap(Object var1, Long var2, int var4, int var5){}; // var1是目标修改对象,var2是地址,var4是期望值,var5是目标值

private static boolean CompareAndSwap(...) {
      if (var1.get() == var4){
            var2 = var5;
            return true;
      }
      return false;
}
CAS的优缺点

优点:锁的粒度非常细,在高并发的环境下效率很高

缺点:容易引起ABA问题
所谓的ABA问题本质上是并发的多线程以为期望值符合而将其改为目标值,但实际上该期望值并非真正业务上的期望值
以银行的例子为例,如果一开始小明转账给小红50元,这时候CAS将执行-50操作,但是如果这时小明的妈妈又转账给小明50元,那么就可能存在CAS再次执行-50的操作

CAS缺点的解决方案

可以额外加一个stamp标记,用来区分相同值

CAS知识点总结

标签:存在   本质   var   知识点   例子   需要   swa   cas   com   

原文地址:https://www.cnblogs.com/Water2Wine/p/13381846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!