As-If-Serial
表示 在单线程环境下,它会保证程序实际的执行结果 和 程序顺序执行的结果一样。怎么理解呢?就是说单线程内,无论编译器、执行器如何优化,该模型都会确保执行结果 和 代码顺序执行的结果一样。
比如我现在有一串代码:
int a = 1; // OP1
int b = 2; // OP2
int c = a + b; // OP3
因为编译器、执行器优化,导致代码的执行顺序会被调换,但是有 As-If-Serial
的保护下, 只有OP1
、 OP2
之间的顺序就能随意调换, OP3
只能最后执行,因为这段代码的数据依赖关系如下图所示:
点击查看【processon】
所以在不影响程序执行结果的前提下,这段程序的实际执行顺序可以是下面的任意一种:
点击查看【processon】
总而言之, As-If-Serial
语义让程序员不需要关心程序的优化,它最终会保证单线程内结果一致性~
但是在多线程环境下, As-If-Serial
恐怕就不能100%屏蔽底层优化了,具体表现在内存可见性问题以及重排序问题上,比如现在有这样一串代码:
线程1 | 线程2 |
---|---|
OP1: int a = 1; | OP3: int b = 2; |
OP2: int a = b; | OP4: int b = a; |
按照 As-If-Serial
来说,线程1和线程2内的语句因为没有依赖关系可以随意替换位置(当然也可能因为可见性问题),可能就会有这样的执行情况:
线程1 | 线程2 |
---|---|
OP2: int a = b; | OP4: int b = a; |
OP1: int a = 1; | OP3: int b = 2; |
最终嘛,就会出现 a == b == 0
的情况。
总而言之, As-If-Serial
无法解决多线程环境下底层带来的乱序、可见性问题~