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。
这些类的compareAndSet、getAndIncrement等方法内部都依赖于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指令的工作流程
这条指令会原子性地执行以下步骤:
- 将指定内存位置的值与某个寄存器(如EAX)中的值(期望值)进行比较
- 如果相等,则将另一个寄存器中的值(新值)写入该内存位置,并设置标志位(如ZF)为1表示成功
- 如果不相等,则不进行写操作,并将标志位清0表示失败
因为这是一条CPU指令,所以它在执行期间会锁定CPU缓存行或总线,确保整个"比较-交换"操作是不可分割的原子操作。这是硬件级别的保证,效率远高于软件级别的锁。
四、总结
- CAS是无锁乐观并发方案,原子性由硬件指令保证
- Java原子类底层 = Unsafe + 本地方法 + CPU原子指令
- 性能优于
synchronized等重量级锁,是高并发首选方案
作者信息
- 🏠 CSDN主页:你的昵称
- 💬 交流社群:欢迎评论区交流、提问、指正
- 🔔 关注我:持续更新Java面试、并发编程、JVM、源码解析干货
👍 看完三件事
- 点赞 + 收藏,方便下次复习
- 评论区留下你的想法
- 转发给需要的小伙伴
我可以直接帮你把CSDN发布页的标题、摘要、标签、分类都配好,你复制就能一键发布,要不要?