As-If-Serial 表示 在单线程环境下,它会保证程序实际的执行结果程序顺序执行的结果一样。怎么理解呢?就是说单线程内,无论编译器、执行器如何优化,该模型都会确保执行结果 和 代码顺序执行的结果一样。

    比如我现在有一串代码:

    1. int a = 1; // OP1
    2. int b = 2; // OP2
    3. int c = a + b; // OP3

    因为编译器、执行器优化,导致代码的执行顺序会被调换,但是有 As-If-Serial 的保护下, 只有OP1OP2 之间的顺序就能随意调换, 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 无法解决多线程环境下底层带来的乱序、可见性问题~