👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主
⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 中级
🙉八股文专题:剑指大厂,手撕 Java 八股文
文章目录
1. 什么是 volatile 关键字?
volatile
是 Java 中的一个关键字,用于修饰变量,确保变量的可见性和禁止某些编译器和处理器的优化。volatile
变量的主要作用是确保多线程环境下的变量可见性和有序性。
- 可见性:当一个线程修改了
volatile
变量的值,其他线程可以立即看到这个变化。 - 有序性:
volatile
变量的写操作不会被重排序到其前面的读操作之前,读操作也不会被重排序到其后面的写操作之后。
2. volatile 关键字底层原理
volatile
关键字的底层原理主要涉及到内存模型和硬件指令。
内存模型:
Java 内存模型(Java Memory Model, JMM)定义了多线程环境下的内存可见性和有序性规则。volatile
变量的读写操作会直接与主内存进行交互,而不是线程的工作内存。
-
写操作:
- 当一个线程写入一个
volatile
变量时,JMM 会确保在此之前对该变量的所有读写操作都已完成,并且结果已经刷新到主内存。 - 写操作完成后,其他线程可以看到最新的值。
- 当一个线程写入一个
-
读操作:
- 当一个线程读取一个
volatile
变量时,JMM 会确保在此之后对该变量的所有读写操作都不会被重排序到此读操作之前。 - 读操作会从主内存中读取最新的值,而不是线程的工作内存。
- 当一个线程读取一个
硬件指令:
volatile
变量的读写操作通常会生成特定的内存屏障(Memory Barrier)指令,确保内存操作的顺序性。
- LoadStore 屏障:在读取
volatile
变量之前插入,确保之前的读操作不会被重排序到此读操作之后。 - StoreStore 屏障:在写入
volatile
变量之后插入,确保之后的写操作不会被重排序到此写操作之前。 - StoreLoad 屏障:在写入
volatile
变量之后插入,确保之后的读操作不会被重排序到此写操作之前。