CAS知识点总结

Posted water2wine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAS知识点总结相关的知识,希望对你有一定的参考价值。

乐观锁&悲观锁

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

解决的问题

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

为了让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知识点总结的主要内容,如果未能解决你的问题,请参考以下文章

线程学习知识点总结

有关synchronized锁的知识点,我用一篇文章总结了

面试被问到CAS原理,触及知识盲区,脸都绿了!

知识点:ConcurrentHashMap总结

java源码剖析: 对象内存布局JVM锁以及优化

CAS登录后回传除了ticket参数以外的其他自定义参数