说到这个 volatile 这个关键字,阿粉觉得看过阿粉文章的,肯定都对这个关键字那是非常的熟悉的,因为做Java开发的,在面试的时候,如果涉及到多线程,那么面试官有不少人会询问关于 volatile 这个关键字的使用,以及他的作用,今天阿粉就来说说这个 volatile 关键的的作用,以及他的一些特性。
volatile
volatile 是 Java 中的一个相对来说比较重要的关键字,主要就是用来修饰会被不同线程访问和修改的变量。
而这个变量只能保证两个特性,一个是保证有序性,另外一个则是保证可见性。
那么什么是有序性,什么又是可见性呢?
有序性
那么什么是有序性呢?
其实程序执行的顺序按照代码的先后顺序执行,禁止进行指令重排序。
看似理所当然,其实并不是这样,指令重排序是JVM为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度。
但是在多线程环境下,有些代码的顺序改变,有可能引发逻辑上的不正确。
而 volatile 就是因为有这个特性,所以才被大家熟知的。
volatile 又是如何保证有序性的呢?
有很多小伙伴就说,网上说的是 volatile 可以禁止指令指令重排序,这就保证了代码的程序会严格按照代码的先后顺序执行。这就保证了有序性。被 volatile 修饰的变量的操作,会严格按照代码顺序执行,就是说当代码执行到 volatile 修饰的变量时,其前面的代码一定执行完毕,后面的代码一定没有执行。
如果这时候,面试官不再继续深挖下去的话,那么恭喜你,可能这个问题已经回答完了,但是如果面试官继续往下深挖,为什么会禁止指令重排,什么又是指令重排呢?
在从源码到指令的执行,一般是分成了三种重排,如图所示:
我们接下来就得看看 volatile 是如何禁止指令重排的。
我们直接用代码来进行验证。
public class ReSortDemo {
in