标签:存在 本质 var 知识点 例子 需要 swa cas com
在操作数据前认为不会有其他人修改数据即为乐观锁,始终认为有人会修改数据即为悲观锁
我们可以首先看一下自增++操作的底层
为了让a加上1,首先我们需要读取a,也就是让b=a,然后我们要让b加1,也就是b=b+1,然后我们把b赋给a所在地址。
这是整个自增操作的底层原理。
但是这三个操作实际上只有第三步是真正要修改数据的,因此为了提高效率,我们可以只给第三步加上锁,前两步可以不加,这就是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;
}
优点:锁的粒度非常细,在高并发的环境下效率很高
缺点:容易引起ABA问题
所谓的ABA问题本质上是并发的多线程以为期望值符合而将其改为目标值,但实际上该期望值并非真正业务上的期望值
以银行的例子为例,如果一开始小明转账给小红50元,这时候CAS将执行-50操作,但是如果这时小明的妈妈又转账给小明50元,那么就可能存在CAS再次执行-50的操作
可以额外加一个stamp标记,用来区分相同值
标签:存在 本质 var 知识点 例子 需要 swa cas com
原文地址:https://www.cnblogs.com/Water2Wine/p/13381846.html