Water2Wine

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
乐观锁&悲观锁

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

解决的问题

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

为了让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标记,用来区分相同值

posted on 2020-07-26 20:22  Water2Wine  阅读(131)  评论(0编辑  收藏  举报