1.volatile变量的特殊规则
1.1 volatile是什么
volatile英文单词意思的易变的,不稳定的。在Java中作为类型修饰符用来修饰变量,所以volatile变量的表面含义是易变的变量,进一步想体现的是共享变量的意思。在代码层面使用关键字volatile修饰变量,延伸到JVM层面是告诉线程这个变量是一个共享变量,线程就不能假定在工作内存中的变量副本是最新的值了,所以在一些操作上有一些特殊的限制或者规定:线程必须将这个共享变量的更新操作通知到其他线程。进一步通俗的说就是线程在工作内存中修改volatile变量后必须立刻写回到主内存;线程在使用volatile变量前必须立刻从主内存加载到工作内存中。
1.2 表现到JVM层面的volatile变量的特殊规则
在博客Java内存模型中提到对volatile变量定义的特殊规则如下:
线程对volatile变量的use动作可以认为是和线程对volatile变量的load、read动作相关联,必须连续一起出现。这条规则要求在工作内存中,每次使用volatile变量前必须从主内存中刷新最新值,用于保证能够看见其他线程对volatile变量所作的修改后的值。
线程对volatile变量的assign动作可以认为是和线程对volatile变量的store、write动作相关联,必须连续一起出现。这条规则要求在工作内存中,每次修改volatile变量的值后必须立刻同步回主内存,用于保证其他线程可以看到自己对volatile变量所做的修改。
假定V、W分别表示两个volatile变量。动作A是线程T对变量V实施的use(assign)操作,动作F是和动作A相关联的load(store)操作,动作P是和动作F对应的变量V的read(write)动作;类似的,动作B是线程T对变量W实施的use(assign)操作,动作G是和动作B相关联的load(store)操作,动作Q是和动作G对应的变量W的read(write)动作。如果A先于B,那么P先于Q。这条规则要求volatile修饰的变量不会被指令重排序优化,保证代码的执行顺序与程序的顺序相同。
在此,对应到happens-before原则即为volatile变量原则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,"后面"是指时间上的先后顺序。
2.volatile的性质及实现原理
volatile变量具有两种性质:一种是可见