码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • CAS的相关知识总结


    目录

    一、CAS的概念

    二、CAS的应用

    1、实现原子类

    2、实现自旋锁

    三、ABA问题

    1、什么是ABA问题

    2、解决ABA问题的方法


    一、CAS的概念

    CAS:全称是Compare And Swap,即比较并交换。

            它会把内存中的某个值,和寄存器A中的值进行比较,如果两个值相同,那么就把寄存器B中的值和内存中的这个值进行交换。

            进行CAS的主要目的是将寄存器B中的值放到内存中。

    用一个伪代码来解释CAS:

     CAS最强大的地方在于,以上的操作是通过一个CPU指令完成的,所以它不仅高效,而且还是线程安全的。

    二、CAS的应用

    1、实现原子类

    什么是原子类?

            在多线程环境下进行count++操作时,这种操作是线程不安全的,要想保证线程安全就得加锁,但是加锁又会导致效率降低。

            所以我们可以使用CAS操作来实现一个原子的++操作,从而既保证了线程安全,也保证了效率问题。

            AtomicInteger类就是一个典型的原子类~

    伪代码解释原子类:

    2、实现自旋锁

    自旋锁:当锁被一个线程持有时,其他线程不会挂机等待,而是会反复询问当前的锁是否被释放,如果锁被释放,那么就可以第一时间获取到这个锁。

    自旋锁的实现方式和原子类比较相似~

    伪代码解释自旋锁:

    这种实现方式的自旋锁会消耗大量CPU资源,如果预期锁竞争不太激烈时,比较适用自旋锁~ 

    因此自旋锁也是一个轻量级锁,也是一个乐观锁~

    三、ABA问题

    1、什么是ABA问题

            在CAS进行到比较操作的时候,如果发现寄存器A中的值和内存中值M相同,此时,我们无法确定M是否是始终没发生过变化的M,还是说M经过了一些计算之后又变回了原来的M。

    举个栗子:

            假设男生A和女生B是一对情侣,有一天,他们分手了,都变成单身的状态。但是男生A又和女生C处了一段时间对象后分手了,于是他又以单身的状态和女生B复合。

            在A和B分手期间,女生B无法确定男生A是否找其他妹子处过对象,还是说男生A分手后一直是单身的状态。

    2、解决ABA问题的方法

    虽然ABA问题发生的概率极低,但也是一个隐患问题,我们需要想办法解决它~

            我们可以记录M的修改次数(版本号),或上次修改时间,两个值都是只增不减,以此来解决ABA问题~

            那么在进行CAS比较的时候,我们不用比较M和A的值,而是比较M的版本号,或者M的上次修改时间:

    (a) 如果当前版本号和读到的版本号相同,则修改数据,并把版本号+1;

    (b) 如果当前版本号大于读到的版本号,则操作失败。

  • 相关阅读:
    以解析csv数据为例,讨论string、char[]、stream 不同类型来源是否能进行高性能读取解析封装可能性
    洛谷P4454 破解D-H协议
    go开发调试之Delve的使用
    计算机网络:数据报与虚电路
    【RS采样】A Gain-Tuning Dynamic Negative Sampler for Recommendation (WWW 2022)
    【CT】LeetCode手撕—415. 字符串相加
    零基础Linux_10(进程)进程终止(main函数的返回值)+进程等待
    HIMA Z7系列卡件Z7306、Z7138、Z7127、Z7126、Z7116
    Maven 私服Nexus的搭建教程windows(搭配android maven插件使用)
    Python学习基础笔记七——元组
  • 原文地址:https://blog.csdn.net/m0_67683346/article/details/127127866
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号