• [编程思想录]无锁之CAS


    一、背景

    解决线程并发产生的问题,除了锁,volatile等关键字之外,在特定的情景下为了提高代码运行的效率,为了摆脱“锁”这个独占式的编程方式之外,还有另外一个原子类的概念。
    java.util.concurrent.atomic包下有Java提供的线程安全的原子类,比如AtomicInteger。而这些原子类就用到了CAS机制,下面我们就来了解一下 CAS机制

    二、CAS原理

    原子类 线程安全 非阻塞,底层没有锁,底层实现原理为CAS无锁技术,就是比较再交换:compare and swap
    CAS包含三个参数(V,E,N)V表示要更新的变量,E表示预期值,N表示新值。
    ● V=需要去更新的变量(主内存的共享变量)
    ● E=预期值(本地内存的副本)
    ● N=新值
    仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。
    如果V=E(主内存的值与本地内存的值一致,说明没人修改),将V的值设置为N。
    如果V不等于E(主内存的值跟本地内存的不一致),已经被修改。这样的情况下,就将E的值设置成V的值,重新刷新,再比较。看下源码,无非就是一个无限刷新,知道V和E的值一致。
    在原子类中大量使用到CAS。

    三、CAS运用案例

    1. AtomicInteger的实现

    要想实现这种自赠的效果就需要加锁,为了提高效率,这种场景下原子类型就可以胜任。

    AtomicInteger ai =new AtomicInteger(1);
    ai.incrementAndGet();
    
    • 1
    • 2

    查看实现代码:

     /**
         * Atomically increments by one the current value.
         *
         * @return the updated value
         */
        public final int incrementAndGet() {
       
            return U.ge
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    javaweb:springboot+vue实现在线点餐系统:ssm+mysql线上点餐
    1090 合并果子
    源码分析: kafka 的微服务架构
    Tomcat 源码构建
    Github 2024-06-15Rust开源项目日报Top10
    consul安装
    Node.js(7)-node的http模块
    如何校准Linux服务器时间
    工作心得——css让元素居中的方法
    SolidJs与React区别
  • 原文地址:https://blog.csdn.net/MrMyGod/article/details/133610892