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