as-if-serial语义的意思指:程序员
无论怎么重排序(编译器和处理器为了提升并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须遵照as-if-serial语义。为了遵照as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操做作重排序,由于这种重排序会改变执行结果。可是,若是操做之间不存在数据依赖关系,spa
这些操做可能被编译器和处理器重排序。为了具体说明,请看下面计算圆面积的代码示例:线程
double pi = 3.14; //Ablog
double r = 1.0; //B排序
double area = pi * r * r; //C内存
上面三个操做的数据依赖关系以下图所示:编译器
如上图所示,A和C之间存在数据依赖关系,同时B和C之间也存在数据依赖关系。所以在最终执行的指令序列中,C不能被重排序到A和B的前面(C排到 A和B的前面,程序的结果将会被改变)。it
但A和B之间没有数据依赖关系,编译器和处理器能够重排序A和B之间的执行顺序。下图是该程序的两种执行顺序:编译
as-if-serial语义把单线程程序保护了起来,遵照as-if-serial语义的编译器,runtime 和处理器共同为编写单线程程序的程序员建立了一个幻觉:单线程程序是按程序的顺序来执行的。as-if-serial语义使单线程程序员无需担忧重排序会 干扰他们,也无需担忧内存可见性问题。class