• CAS策略


    CAS

    CAS(Compare And Swap)比较并交换

    CAS是多线程环境下对共享变量进行修改时的一种策略,主要存在三个参数:当前值、预估值、结果

    CAS采用的策略是当一个线程要对共享变量进行修改时,需要获取内存中共享变量的值作为预期值,并将预期值和结果交给CPU,CPU会将预期值和内存中共享变量的当前值进行判断,如果两者相等,就说明这个过程中没有其他线程修改了共享变量,然后就可以对共享变量进行修改;如果两者不相等,那么CAS就会再次获取共享变量的当前值作为预期值,再次交给CPU进行判断,就这样一直循环,知道循环达到一定的次数或者两者比较相等而结束。

    在这里插入图片描述

    CAS操作是一种乐观锁的实现方式,也就是不加锁,可以使得线程响应速度变快,但同时如果存在很多CAS操作一直循环的情况,就会占用很多资源。

    ABA问题

    指的是一个线程获取到的期望值即使和共享变量的值相等,但是此时的期望值却不是最新的值。

    存在两个线程A和B都获取共享变量的值作为期望值,此时线程B先进行CAS操作,将共享变量从A改为B,线程B再一次进行CAS操作,将共享变量从B改为A,此时线程A使用期望值和共享变量进行判断,虽然是相等的,但是线程A此时的期望值已经不是共享变量的最新值,线程A并不知道,其在获取期望值到进行比较的过程中共享变量发生了几次变化,虽然操作的结果是正确的,但是并不知道迭代了几个版本,于是就出现了ABA问题。

    ABA问题解决

    通过版本号判断是否发生了修改,每次CAS操作成功时都会增加版本号,在进行比较阶段除了比较期望值,还要比较版本号,通过比较版本号能发现版本有没有出现更新的情况,从而解决ABA问题。

  • 相关阅读:
    CSAPP BOMB LAB part2
    yolov3学习笔记
    ChatTTS 开源文本转语音模型本地部署、API使用和搭建WebUI界面(建议收藏)
    选择一个好的生意伙伴很重要!
    Linux·设备文件devfs
    Pytorch从零开始实战06
    剑指 Offer 31. 栈的压入、弹出序列
    怎样在电脑上设置路由器的WiFi密码
    【无标题】在feign post中,如何发送 form-url-encoded 数据
    day57 动规.p17 子序列
  • 原文地址:https://blog.csdn.net/qq_52391639/article/details/132712846