我知道 happens-before 并不意味着 happens before,代码 "A = B + 1; B = 1;" 可以产生结果 "A == 2 and B == 1" 吗?

I know that happens-before does not imply happening before, can the code "A = B + 1; B = 1;" produce the result "A == 2 and B == 1"?

作者在this article中提到"Happens-Before Does Not Imply Happening Before"并举例说明

int A = 0;
int B = 0;

void foo()
{
    A = B + 1;              // (1)
    B = 1;                  // (2)
}

他说 (2) 实际上可以发生在 (1) 之前,我的问题是如果 (2) 实际上发生在 (1)、1 或 2 之前,A 的值是多少?

作者的意思似乎是执行顺序不必与语句编写的顺序相匹配。

程序操作的重新排序可以由 JVM 或 CPU 执行,您对这两者几乎没有控制权。

重点是,在 Java 中,您只能依赖 Java 内存模型保证的内容,而不是源代码中语句的顺序。

AB 是内存中的位置。但是 B+1 操作不会发生在内存中,它发生在 CPU 中。具体来说,作者是在描述这两个操作。

A = B + 1 (1)

  • A1 - 内存位置 B (0) 中的值被加载到 CPU 寄存器
  • A2 - CPU 寄存器递增 1
  • A3 - CPU 寄存器 (1) 中的值被写入内存位置 A

B = 1 (2)

  • B1 - 值 1 被写入内存位置 B

Happens-Before 要求 B 的读取(步骤 A1)发生在 B 的写入(步骤 B1)之前。但是,其余操作没有相互依赖性,可以在不影响结果的情况下重新排序。这些序列中的任何一个都会产生相同的结果

  • A1、B1、A2、A3
  • A1、A2、B1、A3
  • A1、A2、A3、B1