CAS的底层实现

CAS的底层实现?(Java面试必看)

本文为Java并发核心知识点总结,原汁原味整理CAS原理,适合面试复习、知识梳理

### 文章目录

  • [CAS的底层实现?(Java面试必看)](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [@toc](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [一、CAS核心概念](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [二、Java中的体现](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [三、底层实现剖析](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [1. Java代码层(应用层)](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [2. JVM本地方法层(JNI层)](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [3. 操作系统/硬件层(最终实现)](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [CMPXCHG指令的工作流程](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [四、总结](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [作者信息](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)
  • [👍 看完三件事](#文章目录 CAS的底层实现?(Java面试必看) @[toc] 一、CAS核心概念 二、Java中的体现 三、底层实现剖析 1. Java代码层(应用层) 2. JVM本地方法层(JNI层) 3. 操作系统/硬件层(最终实现) CMPXCHG指令的工作流程 四、总结 作者信息 👍 看完三件事)

一、CAS核心概念

CAS(Compare-And-Swap),即比较并交换

  • 是一种无锁的、乐观的并发控制机制
  • 操作是原子的,执行过程中不会被其他线程中断
  • 核心思想:
    我认为V的值应该是A,如果是,那么把它更新为B;如果不是,说明有其他线程修改过了,那我就不更新了,并可以选择重试或放弃。

二、Java中的体现

在Java中,我们通常不直接操作底层指令,而是通过 java.util.concurrent.atomic 包下的原子类(如AtomicInteger)来使用CAS。

这些类的compareAndSetgetAndIncrement等方法内部都依赖于CAS操作。


三、底层实现剖析

CAS的底层实现可以分为三个层次:
Java代码层 → JVM本地方法层 → 操作系统/硬件层

1. Java代码层(应用层)

这是我们直接编写和调用的层面。

java 复制代码
import java.util.concurrent.atomic.AtomicInteger;

public class CASDemo {
    public static void main(String [] args) {
        AtomicInteger atomicInt = new AtomicInteger(5); // 初始值为5

        // 这就是一个典型的CAS操作
        // 期望值是5,如果当前值确实是5,就把它更新为10
        boolean success = atomicInt.compareAndSet(5, 10);
        System.out.println("更新是否成功 : " + success + ", 当前值 : " + atomicInt.get());

        // 这次会失败,因为当前值已经是10,而不是8
        success = atomicInt.compareAndSet(8, 15);
        System.out.println("更新是否成功 : " + success + ", 当前值 : " + atomicInt.get());
    }
}

输出:

复制代码
更新是否成功 : true, 当前值 : 10
更新是否成功 : false, 当前值 : 10

2. JVM本地方法层(JNI层)

当我们点进AtomicInteger.compareAndSet方法,会发现它调用了Unsafe类的compareAndSwapInt方法。

java 复制代码
// AtomicInteger.java 内部
public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

这个Unsafe类是JDK内部使用的、用于执行低级别、不安全操作的工具类。它提供了像访问内存、操作对象字段偏移量等直接功能。
compareAndSwapInt就是一个本地方法(Native Method),它的实现不在Java中,而在C/C++代码中。

java 复制代码
// Unsafe.java
public final native boolean compareAndSwapInt(Object o, long offset, int expected, int x);

3. 操作系统/硬件层(最终实现)

这是CAS魔法的发生地。JVM会为这个本地方法实现不同的版本,具体取决于操作系统和CPU架构。

  • 在x86架构的Linux系统上:这个本地方法最终会映射到CPU的一条名为 CMPXCHG (Compare and Exchange) 的汇编指令
  • 在其他平台:可能会是其他不同的指令,但原理相似
CMPXCHG指令的工作流程

这条指令会原子性地执行以下步骤:

  1. 将指定内存位置的值与某个寄存器(如EAX)中的值(期望值)进行比较
  2. 如果相等,则将另一个寄存器中的值(新值)写入该内存位置,并设置标志位(如ZF)为1表示成功
  3. 如果不相等,则不进行写操作,并将标志位清0表示失败

因为这是一条CPU指令,所以它在执行期间会锁定CPU缓存行或总线,确保整个"比较-交换"操作是不可分割的原子操作。这是硬件级别的保证,效率远高于软件级别的锁。


四、总结

  1. CAS是无锁乐观并发方案,原子性由硬件指令保证
  2. Java原子类底层 = Unsafe + 本地方法 + CPU原子指令
  3. 性能优于synchronized等重量级锁,是高并发首选方案

作者信息

  • 🏠 CSDN主页:你的昵称
  • 💬 交流社群:欢迎评论区交流、提问、指正
  • 🔔 关注我:持续更新Java面试、并发编程、JVM、源码解析干货

👍 看完三件事

  1. 点赞 + 收藏,方便下次复习
  2. 评论区留下你的想法
  3. 转发给需要的小伙伴

我可以直接帮你把CSDN发布页的标题、摘要、标签、分类都配好,你复制就能一键发布,要不要?

相关推荐
嘻哈∠※9 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_79810 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25811 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅11 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息13 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒13 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了14 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道14 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_9499506315 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路15 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq