Volatile关键字的作用经常在Java面试被问到,下面就重点详解Volatile关键字的作用@mikechen
Volatile简介
Volatile是一个Java语言的类型修饰符,Volatile作用主要就2点:保证可见性与禁止指令重排。
Volatile作用
一旦一个共享变量,比如:类的成员变量、类的静态成员变量被Volatile修饰之后,那么就具备了两层语义:
1、保证多线程下的可见性
2、禁止进行指令重排序(即保证有序性)
Volatile可见性
在多线程环境中,由于每个线程有自己的缓存,可能会出现一个线程修改了变量的值,而其他线程还在使用之前缓存的值,这种情况下就会出现数据不一致的问题。
使用Volatile关键字可以避免这种问题的发生,因为它会告诉编译器和CPU,该变量的值可能随时会被其他线程修改,因此每次访问该变量时都需要从内存中读取最新的值。
如下图所示:
Volatile可以确保在多线程环境下变量的可见性,也就是说当一个线程修改了Volatile变量的值时,其他线程可以立即看到这个修改后的值,而不是使用之前缓存的值。
Volatile指令重排
在编写多线程程序时,由于现代CPU具有乱序执行的特性,因此编译器和CPU可能会对指令进行重排,以提高程序的执行效率。
如下图所示:
比如:singleton = new Singleton()分配内存的语句,就会出现上图的3个步骤:
1. 给 singleton 分配内存;
2. 调用 Singleton 的构造函数来初始化成员变量,形成实例;
3. 将singleton对象指向分配的内存空间;
但是在某些情况下,这种重排可能会导致程序出现意外的结果,特别是在多线程环境下,就会出现上图右侧的顺序的问题。
使用Volatile关键字可以告诉编译器和CPU,该变量的值可能随时被其他线程修改,因此不能对该变量的读取和写入进行重排。
所以,Volatile的另外一个作用就是防止指令重排。
以上就是Volatile关键字的作用详解,更多Volatile的内容,请查看:Volatile的实现原理(看这篇就够了)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》