使用关键字volatile可以禁止代码的重排序;
在Java程序运行时,JIT(即使编译器)可以动态地改变程序代码运行地顺序;例如,有如下代码:
A代码-重耗时 B代码-轻耗时 C代码-重耗时 D代码-轻耗时
在多线程环境下,JIT有可能进行代码重排序,重排序后地代码顺序有可能如下:
B代码-轻耗时 D代码-轻耗时 A代码-重耗时 C代码-重耗时
这样做地主要原因是CPU流水线是同时执行这4个指令的,那么轻耗时的代码在很大程度上先执行完成,以让出CPU流水线给其他指令,所以代码重排序是为了追求更高的程序运行的效率;
重排序发生在没有依赖关系时,例如,对于上面的A,B,C,D代码,B,C,D代码不依赖A代码的结果,C,D代码不依赖A,B代码的结果,D代码不依赖A,B,C代码的结果,这种情况下就会发生重排序,如果代码之间有依赖关系,则代码不会重排序;
使用关键字volatile可以禁止代码重排序,例如,有如下代码:
A变量的操作 B变量的操作 volatile Z变量的操作 C变量的操作 D变量的操作
那么会有4种情况发生:
换言之,变量Z是一个屏障,Z变量之前或之后不可以跨越Z变量,这就是屏障的作用,关键字synchronized具有同样的特性;
原文:https://www.cnblogs.com/coder-zyc/p/12650493.html