Java中的 volatile 关键字
1.简言概括:
volatile关键字,是java生态中非常重要的一个关键字,主要用于Java多线程操作变量时的可见性。
2.理论知识
2.1 Java内存模型
在使用 volatile 关键字之前,我们需要知道对Java的内存有一定的了解:
-
Java的内存模型决定了所有变量都保存在主内存(main memory)中,每个线程都有自己独立的"工作内存”(寄存器),工作内存中保存的是线程运行时所需要的变量的主内存拷贝,即副本。
-
每个线程对变量的操作都在自己的工作内存中,不能直接操作主内存。
-
每个线程不能直接访问彼此的工作内存,线程之间对于变量的传递也需要通过与主内存内容同步。
-
通常情况下,为了提升性能,一个线程会在自己的“工作内存”中缓存要访问变量的副本,当线程需要读某个变量的时候,优先从自己的“工作内存”中查找,如果“工作内存”中有该变量则直接读取,如果没有,则需要从“主内存”中同步到自己的“工作内存”中后在读取。
2.2 volatile 关键字的特性
-
Java中,被 volatile 关键字修饰的变量,一旦被线程更改,会立即同步到主内存中,线程每次读取该变量的时候,都是直接从主内存中同步读取,不管工作内存中有没有该变量,这样就保证,每个线程读取到的变量值是一致的。
-
volatile 具有可见性、有序性、不具备原子性(原子性是 volatile 关键字与synchronized、Lock 最大的功能差异)。
3.volatile 关键字使用前提与场景
- 使用场景:适用于读多写少的场景。
- 其他用法:可用作状态标志。
4 实际应用
Java 中 volatile 关键字的应用:
JDK中 ,ConcurrentHashMap 的 Entry 的 value 和 next 被声明为 volatile ,AtomicLong 中的 value 被声明为 volatile,AtomicLong 通过 CAS原理(可以理解为乐观锁)保证了原子性。
5 英文释义
volatile 在英文中的含义,可参考第一点 “不稳定性的”,所以我们也可以从字面意思上理解,当 Java 读取到某个被 volatile 修饰的变量时,会认为它是不稳定,不可靠的,所以会从主内存中读取。
注:从主内存中读取,并非直接读取主内存,而是从主内存中同步到“工作内存”,再获取工作内存中最新的变量值。