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发布页的标题、摘要、标签、分类都配好,你复制就能一键发布,要不要?

相关推荐
九英里路2 小时前
cpp容器——string模拟实现
java·前端·数据结构·c++·算法·容器·字符串
YDS8292 小时前
大营销平台 —— 抽奖前置规则过滤
java·spring boot·ddd
仍然.2 小时前
多线程---CAS,JUC组件和线程安全的集合类
java·开发语言
不懂的浪漫2 小时前
mqtt-plus 架构解析(五):错误处理与 ErrorAction 聚合策略
java·spring boot·后端·物联网·mqtt·架构
呼啦啦5612 小时前
C++vector
java·c++·缓存
花千树-0102 小时前
MCP + Function Calling:让模型自主驱动工具链完成多步推理
java·agent·react·mcp·toolcall·harness·j-langchain
Benszen2 小时前
Linux容器:轻量级虚拟化革命
java·linux·运维
凸头3 小时前
Lombok 包底层浅析
java
不懂的浪漫3 小时前
mqtt-plus 架构解析(三):Payload 序列化与反序列化,为什么要拆成两条链
java·spring boot·物联网·mqtt·架构