Fork me on Gitee

CAS解析

什么是CAS

  • 应用场景:并发

  • 我认为V的值应该是A,如果是的话,那我就把它修改成B,如果不是A(说明被别人修改过了),那我就不修改了,避免多人同时操作导致出错。

  • CAS有三个操作数:内存值V、预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做,最后返回现在的V值。

    image-20240303163709521

  • 利用了CPU的特殊指令

  • CAS的等价代码(语义)

public class SimulatedCAS {

    private volatile int value;

    /**
     * 使用synchronized保证其原子操作
     * @param expectValue
     * @param newValue
     * @return
     */
    public synchronized int compareAndSwap(int expectValue,int newValue){
        int oldValue = value;
        if(oldValue == value){
            value = newValue;
        }
        return oldValue;
    }
}

应用场景

  • 乐观锁

  • 并发容器

  • 原子类

以AtomicInteger为例,分析在Java中如何利用CAS实现原子操作的

image-20240303170602380

  • AtomicInteger加载Unsafe工具,用来直接操作内存数据
  • 用UnSafe来实现底层操作
  • 用volatile修饰value字段,保证可见性
  • getAndAddInt方法分析

Unsafe类

image-20240303171011243

Unsafe类中的compareAndSwapInt

image-20240303171109141

Unsafe的native实现方法底层源码, Atomic::cmpxchg(x,addr,e),

image-20240303171226170

缺点

  • ABA问题:添加版本号解决
  • 自旋时间过长 do while
posted @ 2024-03-03 23:25  shine-rainbow  阅读(2)  评论(0编辑  收藏  举报