🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了CAS的CPU底层原子命令CMPXCHG🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
🌈序言:
JAVA并发编程一直是难点,痛点,但又是进阶之重点,此关必过。今日得《冰河技术》之良品辅助,应按本系列学之习之,时时复习,长此以往必能穿魂入脉,习得大功。
记住——别违背科学发展的客观规律。别一味地赶进度以满足自己学的都么快的虚荣心,自欺欺人,要老老实实的走好每一步。
【并发编程全貌】
🔥Java并发编程全集
🌈引出:
CAS作为一种免锁机制,提供了乐观锁的解决方案。CAS的CPU底层原子命令CMPXCHG。
CAS(Compare And Swap,比较并交换)是一种实现无锁同步的关键机制,用于确保多线程环境中对共享变量的原子操作。CAS 的底层通常依赖于处理器提供的原子指令,例如在 x86 架构下使用的 CMPXCHG
指令。下面是对 CMPXCHG
指令的详细解释。
1. CMPXCHG
指令的基本原理:
CMPXCHG
(Compare and Exchange)指令的基本原理是:比较内存中的某个值与寄存器中的值,如果它们相等,则将另一个寄存器中的新值存入该内存位置。如果不相等,则不更新内存,而是将内存中的值复制到寄存器中。这个过程是原子性的,即不可分割的,中间不会被其他线程打断。
2. CMPXCHG
指令的操作步骤:
CMPXCHG
指令通常涉及以下三个操作数:
- 目的操作数(内存地址):需要比较并可能更新的内存位置。
- 比较操作数(寄存器EAX):存储当前期望的值。
- 交换操作数(寄存器):存储要更新的新值。
具体步骤如下:
- 比较:比较目的操作数(内存地址中的值)与寄存器EAX中的值。
- 如果它们相等,则将交换操作数(寄存器中的新值)存入内存地址,完成更新。
- 如果不相等,则不更新内存,而是将内存地址中的值复制到寄存器EAX中。
- 更新:如果比较成功,更新内存;如果比较失败,则返回当前的内存值,供程序重新判断和操作。
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
方法。其过程如下:
- 读取:从内存中读取当前值,并保存到寄存器中。
- 比较:将当前值与期望值进行比较。
- 交换:如果比较成功,更新内存中的值;否则,返回失败,让调用者决定下一步操作(如重新尝试)。
5. CMPXCHG
的优缺点:
优点:
- 无锁操作:
CMPXCHG
提供了无需锁定的同步机制,可以避免传统锁带来的上下文切换和性能开销。 - 高效并发:适用于高并发场景下的简单同步操作。
缺点:
- ABA 问题:由于
CMPXCHG
只比较值,而不关心中间状态变化,可能会出现ABA问题(即内存值从A变成B,再变回A),导致错误判断。【版本号解决】 - 操作粒度有限:
CMPXCHG
只能操作一个内存地址,无法直接用于更复杂的数据结构或多个变量的同步。
总结
CMPXCHG
指令是 CAS 操作的核心,用于在多线程环境下提供一种原子性、无锁的更新机制。它通过硬件支持的原子性操作,保证了在高并发情况下的正确性和效率,但也有一定的局限性,如需要额外处理 ABA 问题。
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理 关注走一波💕💕
🌈🌈微服务项目之黑马头条 关注走一波💕💕
🌈🌈redis深度项目之黑马点评 关注走一波💕💕
🌈🌈JAVA面试八股文系列专栏 关注走一波💕💕
🌈🌈JAVA基础试题集精讲 关注走一波💕💕
🌈🌈代码随想录精讲200题 关注走一波💕💕
总栏
🌈🌈JAVA基础要夯牢 关注走一波💕💕
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈数据结构与算法 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!