Volatile关键字的作用(3大作用详解)

Volatile关键字的作用(3大作用详解)-mikechen

Volatile关键字的作用经常在Java面试被问到,下面就重点详解Volatile关键字的作用@mikechen

Volatile简介

Volatile是一个Java语言的类型修饰符,Volatile作用主要就2点:保证可见性与禁止指令重排。

 

Volatile作用

一旦一个共享变量,比如:类的成员变量、类的静态成员变量被Volatile修饰之后,那么就具备了两层语义:

1、保证多线程下的可见性

2、禁止进行指令重排序(即保证有序性)

 

Volatile可见性

在多线程环境中,由于每个线程有自己的缓存,可能会出现一个线程修改了变量的值,而其他线程还在使用之前缓存的值,这种情况下就会出现数据不一致的问题。

使用Volatile关键字可以避免这种问题的发生,因为它会告诉编译器和CPU,该变量的值可能随时会被其他线程修改,因此每次访问该变量时都需要从内存中读取最新的值。

如下图所示:

Volatile关键字的作用(3大作用详解)-mikechen

Volatile可以确保在多线程环境下变量的可见性,也就是说当一个线程修改了Volatile变量的值时,其他线程可以立即看到这个修改后的值,而不是使用之前缓存的值。

 

Volatile指令重排

在编写多线程程序时,由于现代CPU具有乱序执行的特性,因此编译器和CPU可能会对指令进行重排,以提高程序的执行效率。

如下图所示:
Volatile关键字的作用(3大作用详解)-mikechen

比如:singleton = new Singleton()分配内存的语句,就会出现上图的3个步骤:

1. 给 singleton 分配内存;

2. 调用 Singleton 的构造函数来初始化成员变量,形成实例;

3. 将singleton对象指向分配的内存空间;

但是在某些情况下,这种重排可能会导致程序出现意外的结果,特别是在多线程环境下,就会出现上图右侧的顺序的问题。

使用Volatile关键字可以告诉编译器和CPU,该变量的值可能随时被其他线程修改,因此不能对该变量的读取和写入进行重排。

所以,Volatile的另外一个作用就是防止指令重排。

以上就是Volatile关键字的作用详解,更多Volatile的内容,请查看:Volatile的实现原理(看这篇就够了)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法