• CAS锁机制


    一、什么是CAS?

    在这里插入图片描述

    Compare And Swap,比较并交换

    在修改值之前,先比较一下值有没有被别人修改。

    update table set column = #{newValue} where id = #{id} and column = #{oldValue}
    
    • 1

    在这里插入图片描述

    二、CAS优点

    1. 无锁(synchronized),无需切换线程,竞争CPU时间片
    2. 轻量级,适用于并发量不高,多核CPU的场景

    三、CAS缺点

    1. ABA问题

    我在修改前,别人偷偷修改了并且又改回了原始值,我比较就通过了,即无法感知别人的修改。

    在这里插入图片描述

    1. 自旋开销问题

    在高并发下,可能会一直自旋,长时间占用CPU资源

    1. 共享变量单一问题

    只能保证单个共享变量的原子性,不能保证多个共享变量,或者代码块

    四、AtomicInteger等原子类(JUC并发包)

    volatile + CAS

    1. volatile保证内存可见性。
    2. sun.misc.UnSafe类通过一系列用C/C++实现的本地方法操作CPU指令实现CAS。

    通过成员变量的内存偏移量,直接读取或设置该成员变量的值(详见《OOP-Klass HotSpot对象模型》)

    在这里插入图片描述
    在这里插入图片描述

    compareAndSwapInt(Object o, long offset, int expect, int update)

    1. 读取传入对象o在内存中偏移量为offset位置的值与期望值expect作比较。
    2. 相等就把update值赋值给offset位置的值,方法返回true
    3. 不相等,就取消赋值,方法返回false

    五、CAS使用事项

    1. ABA问题

    增加版本号

    数据库:

    update table set column = #{value}, version = version + 1 where id = #{id} and version = #{oldVersion}
    
    • 1

    Java:

    java.util.concurrent.atomic.AtomicStampedReference
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    1. 共享变量单一问题
    java.util.concurrent.atomic.AtomicReference
    
    • 1

    把多个成员变量组成一个对象,更新整个对象

    在这里插入图片描述
    在这里插入图片描述

    AtomicintegerAtomicBoolean原理是一样的,只不过AtomicIntegerAtomicBoolean底层调用的是unsafe.compareAndSwapInt方法CAS操作int的值,而这里是compareAndSwapObject是CAS操作一个内存对象而已

    在这里插入图片描述

    1. 循环时间长开销很大问题

    在这里插入图片描述

    另外,也可以通过代码控制,循环达到一定次数,就结束循环,并返回提示用户”操作失败,请稍后重试~

  • 相关阅读:
    9.1充血模型和贫血模型
    红帽权限设置及提权知识点结合
    Duchefa丨S0188盐酸大观霉素五水合物中英文说明书
    with语句和上下文管理器
    几个数组相关常见算法题
    全栈开发学习记录:一个简单的node.js服务器以及用到的表、视图、存储过程和配套测试的前端.
    Linux 进程概念
    elasticsearch代码基本实现
    【lwip】08-ARP协议一图笔记及源码实现
    白杨SEO:有技能专长的人想要做好知识付费的核心是什么?
  • 原文地址:https://blog.csdn.net/weixin_44360895/article/details/126863034