我知道 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 内存模型保证的内容,而不是源代码中语句的顺序。
A
和 B
是内存中的位置。但是 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
作者在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 内存模型保证的内容,而不是源代码中语句的顺序。
A
和 B
是内存中的位置。但是 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