cas会加锁吗?
含义
cas: compare and swap 比较和交换,如果期望值和当前值相等,那么则设置为新值,否则不做任何操作。
原理
cas操作保证了共享变量的原子性,主要是通过unsafe类。Unsafe是CAS的核心类。因为Java无法直接访问底层操作系统,而是通过本地(native)方法来访问。不过尽管如此,JVM还是开了一个后门,JDK中有一个类Unsafe,它提供了硬件级别的原子操作。
硬件层面CAS又是如何保证原子性的呢?真的完全没加锁吗?
拿比较常见的x86架构的CPU来说,其实 CAS 操作通常使用 cmpxchg 指令实现。
1.cmpxchg 指令是一条原子指令。在 CPU 执行 cmpxchg 指令时,处理器会自动锁定总线,防止其他 CPU 访问共享变量,然后执行比较和交换操作,最后释放总线。
2.cmpxchg 指令在执行期间,CPU 会自动禁止中断 。这样可以确保 CAS 操作的原子性,避免中断或其他干扰对操作的影响。
3.cmpxchg 指令是硬件实现的,可以保证其原子性和正确性。CPU 中的硬件电路确保了 cmpxchg 指令的正确执行,以及对共享变量的访问是原子的。
所以,在操作系统层面,CAS还是会加锁的,通过加锁的方式锁定总线,避免其他CPU访问共享变量。
本文来自博客园,作者:云哲,转载请注明原文链接:https://www.cnblogs.com/yyz0225/p/18057121
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)