Java 中的关键字 (1)—— Java volatile

Java中的 volatile 关键字

1.简言概括:

volatile关键字,是java生态中非常重要的一个关键字,主要用于Java多线程操作变量时的可见性

2.理论知识

2.1 Java内存模型

在使用 volatile 关键字之前,我们需要知道对Java的内存有一定的了解:

  1. Java的内存模型决定了所有变量都保存在主内存(main memory)中,每个线程都有自己独立的"工作内存”(寄存器),工作内存中保存的是线程运行时所需要的变量的主内存拷贝,即副本。

  2. 每个线程对变量的操作都在自己的工作内存中,不能直接操作主内存。

  3. 每个线程不能直接访问彼此的工作内存,线程之间对于变量的传递也需要通过与主内存内容同步。

  4. 通常情况下,为了提升性能,一个线程会在自己的“工作内存”中缓存要访问变量的副本,当线程需要读某个变量的时候,优先从自己的“工作内存”中查找,如果“工作内存”中有该变量则直接读取,如果没有,则需要从“主内存”中同步到自己的“工作内存”中后在读取。

2.2 volatile 关键字的特性

  1. Java中,被 volatile 关键字修饰的变量,一旦被线程更改,会立即同步到主内存中,线程每次读取该变量的时候,都是直接从主内存中同步读取,不管工作内存中有没有该变量,这样就保证,每个线程读取到的变量值是一致的。

  2. volatile 具有可见性、有序性、不具备原子性(原子性是 volatile 关键字与synchronized、Lock 最大的功能差异)。

3.volatile 关键字使用前提与场景

  1. 使用场景:适用于读多写少的场景。
  2. 其他用法:可用作状态标志。

4 实际应用

Java 中 volatile 关键字的应用:

JDK中 ,ConcurrentHashMap 的 Entry 的 value 和 next 被声明为 volatile ,AtomicLong 中的 value 被声明为 volatile,AtomicLong 通过 CAS原理(可以理解为乐观锁)保证了原子性。

5 英文释义

volatile 在英文中的含义,可参考第一点 “不稳定性的”,所以我们也可以从字面意思上理解,当 Java 读取到某个被 volatile 修饰的变量时,会认为它是不稳定,不可靠的,所以会从主内存中读取。

注:从主内存中读取,并非直接读取主内存,而是从主内存中同步到“工作内存”,再获取工作内存中最新的变量值。

在这里插入图片描述

发布了19 篇原创文章 · 获赞 5 · 访问量 2640

猜你喜欢

转载自blog.csdn.net/weixin_36908494/article/details/101515312