CAS的CPU底层原子命令CMPXCHG

🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:详细讲解了CAS的CPU底层原子命令CMPXCHG🌈⭕🔥


【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】


🌈序言:

        JAVA并发编程一直是难点,痛点,但又是进阶之重点,此关必过。今日得《冰河技术》之良品辅助,应按本系列学之习之,时时复习,长此以往必能穿魂入脉,习得大功。

记住——别违背科学发展的客观规律。别一味地赶进度以满足自己学的都么快的虚荣心,自欺欺人,要老老实实的走好每一步。

 【并发编程全貌】


🔥Java并发编程全集

🔥 所有JAVA基础一键查阅(含习题集)-CSDN博客


🌈引出

CAS作为一种免锁机制,提供了乐观锁的解决方案。CAS的CPU底层原子命令CMPXCHG。


        CAS(Compare And Swap,比较并交换)是一种实现无锁同步的关键机制,用于确保多线程环境中对共享变量的原子操作。CAS 的底层通常依赖于处理器提供的原子指令,例如在 x86 架构下使用的 CMPXCHG 指令。下面是对 CMPXCHG 指令的详细解释。

1. CMPXCHG 指令的基本原理

CMPXCHG(Compare and Exchange)指令的基本原理是:比较内存中的某个值与寄存器中的值,如果它们相等,则将另一个寄存器中的新值存入该内存位置。如果不相等,则不更新内存,而是将内存中的值复制到寄存器中。这个过程是原子性的,即不可分割的,中间不会被其他线程打断。

2. CMPXCHG 指令的操作步骤

CMPXCHG 指令通常涉及以下三个操作数:

  • 目的操作数(内存地址):需要比较并可能更新的内存位置。
  • 比较操作数(寄存器EAX):存储当前期望的值。
  • 交换操作数(寄存器):存储要更新的新值。

具体步骤如下:

  1. 比较:比较目的操作数(内存地址中的值)与寄存器EAX中的值。
    • 如果它们相等,则将交换操作数(寄存器中的新值)存入内存地址,完成更新。
    • 如果不相等,则不更新内存,而是将内存地址中的值复制到寄存器EAX中。
  2. 更新:如果比较成功,更新内存;如果比较失败,则返回当前的内存值,供程序重新判断和操作。

3. CMPXCHG 指令的示例

假设我们要更新一个内存地址中的值,如果它当前的值是5,那么我们将其更新为10。伪代码可以表示如下:

 

assembly

复制代码。

MOV EAX, 5 ; 将期望的值5放入EAX寄存器 MOV EBX, 10 ; 将新值10放入EBX寄存器 CMPXCHG [mem], EBX ; 比较并交换:[mem] == EAX ? [mem] = EBX : EAX = [mem]

在这个例子中,CMPXCHG 指令会比较 [mem] 和 EAX 的值:

如果 [mem] == EAX(即5),那么将 EBX 中的值10存入 [mem]。
如果 [mem] != EAX,那么将 [mem] 中的值存入 EAX,而不更新 [mem]

4. CMPXCHG 在 CAS 中的应用

在 Java 或其他高级语言中,CAS 操作通常包装在原子操作类中(例如 java.util.concurrent.atomic 包中的原子类)。这些类底层依赖 CMPXCHG 指令实现 compareAndSet 方法。其过程如下:

  1. 读取:从内存中读取当前值,并保存到寄存器中。
  2. 比较:将当前值与期望值进行比较。
  3. 交换:如果比较成功,更新内存中的值;否则,返回失败,让调用者决定下一步操作(如重新尝试)。

5. CMPXCHG 的优缺点

优点

  • 无锁操作CMPXCHG 提供了无需锁定的同步机制,可以避免传统锁带来的上下文切换和性能开销。
  • 高效并发:适用于高并发场景下的简单同步操作。

缺点

  • ABA 问题:由于 CMPXCHG 只比较值,而不关心中间状态变化,可能会出现ABA问题(即内存值从A变成B,再变回A),导致错误判断。【版本号解决】
  • 操作粒度有限CMPXCHG 只能操作一个内存地址,无法直接用于更复杂的数据结构或多个变量的同步。

总结

CMPXCHG 指令是 CAS 操作的核心,用于在多线程环境下提供一种原子性、无锁的更新机制。它通过硬件支持的原子性操作,保证了在高并发情况下的正确性和效率,但也有一定的局限性,如需要额外处理 ABA 问题。



💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏推荐

🌈🌈计算机科学入门系列                     关注走一波💕💕

🌈🌈CSAPP深入理解计算机原理        关注走一波💕💕

🌈🌈微服务项目之黑马头条                 关注走一波💕💕

🌈🌈redis深度项目之黑马点评            关注走一波💕💕

🌈🌈JAVA面试八股文系列专栏           关注走一波💕💕

🌈🌈JAVA基础试题集精讲                  关注走一波💕💕   

🌈🌈代码随想录精讲200题                  关注走一波💕💕


总栏

🌈🌈JAVA基础要夯牢                         关注走一波💕💕  

🌈🌈​​​​​​JAVA后端技术栈                          关注走一波💕💕  

🌈🌈JAVA面试八股文​​​​​​                          关注走一波💕💕  

🌈🌈JAVA项目(含源码深度剖析)    关注走一波💕💕  

🌈🌈计算机四件套                               关注走一波💕💕  

🌈🌈数据结构与算法                           ​关注走一波💕💕  

🌈🌈必知必会工具集                           关注走一波💕💕

🌈🌈书籍网课笔记汇总                       关注走一波💕💕         



📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值