• CAS核心思想、底层实现



    ★ 1、CAS 是什么

    CAS 是比较并交换,是实现并发算法时常用到的一种技术当内存的值和期望的值相等时,进行更新,否则 什么都不做重来

    CAS 的底层实现:是靠硬件实现的,靠硬件的原子性实现CAS是一条CPU的原子指令cmpxchg指令),不会造成所谓的数据不一致问题

    重来==>自旋

    CAS 类似乐观锁,乐观的认为别人没有修改,当值还是预期值,就进行修改,否则可能什么都不做,或者重来。


    ★ 2、CAS 应用举例

    • 原子操作类,比如整型的原子操作类的compareAndSet方法
    • 我的博客项目中,在更新文章浏览次数时,当前内存的文章浏览次数 和 期望中的数据库的文章浏览次数 进行比较,如果是相同的,则加1,否则 什么都不做



    3、原子类

    原子类==> 底层思想/工作原理 CAS ==> Unsafe 类的CPU 原语级别的汇编操作

    • CAS 是靠硬件实现的,靠硬件的原子性实现CAS是一条CPU的原子指令cmpxchg指令),不会造成所谓的数据不一致问题

      Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。


    ■ AtomicInteger 类主要利用 CAS + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升。

    new AtomicInteger().compareAndSet(0, 1);
    
    // 底层实现
    public final int getAndAdd(int delta) {
     return unsafe.getAndAddInt(this, valueOffset, delta);
    }
    public final boolean compareAndSet(int expect, int update) {
     return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }
    
    
    
    new AtomicInteger().getAndAdd(1);//获取到当前值并加1
    // 底层实现
    public final int getAndAdd(int delta) {
    return unsafe.getAndAddInt(this, valueOffset, delta);
    }
    public final int getAndAddInt(Object var1, long var2, int var4) {
    int var5;
    do {
       var5 = this.getIntVolatile(var1, var2);
    } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
    return var5;
    }
    

    工作中,不建议使用Unsafe 类,类名就提示你了"不安全"!



    4、Unsafe 类

    • 是CAS的核心类
    • 可以像C的指针一样直接操作内存
    • Unsafe类中的所有方法都是native修饰的Unsafe类中的方法都可以直接调用操作系统底层资源去执行相应任务
    //原子类
    public final int getAndIncrement() {
         return unsafe.getAndAddInt(this, valueOffset, 1);
    }
    
    private volatile int value;
    

    变量valueOffset,表示该变量值在内存中的偏移地址,因为 Unsafe就是根据内存偏移地址获取数据的。

    变量value用volatile修饰,保证了多线程之间的内存可见性。每次获取的值都是最新的。



    5、CAS 带来的问题

    • 循环时间长,可能死循环,开销很大
    • ABA 问题
      • 解决ABA 问题: 带版本号的原子引用 AtomicStampedReference




    如果本文对你有帮助的话记得给一乐点个赞哦,感谢!

  • 相关阅读:
    2023计算机四非保研(复试:东北大学,成电,西电,浙软,中海洋,天大)
    gdb core dump使用简介
    numpy生成0和1数组方法,从已有数组生成新数组方法、生成固定范围内数组、生成随机数组,绘制指定均值和标准差正态分布图、均匀分布图绘制
    查看文件的二进制数据
    5-RabbitMQ工作模式-Publish/Subscribe发布与订阅模式
    vite vue3 规范化与Git Hooks
    构建高性能物联网数据平台:EMQX和CnosDB的完整教程
    [护网杯 2018]easy_tornado 解析
    风控建模十二:数据淘金——如何从APP数据中挖掘出有效变量
    Kotlin数据流概览
  • 原文地址:https://blog.csdn.net/weixin_45630258/article/details/127043184