在this article中,作者提到“之前发生并不意味着之前发生”,他展示了一个示例进行解释。
int A = 0;
int B = 0;
void foo()
{
A = B + 1; // (1)
B = 1; // (2)
}
他说(2)实际上可以在(1)之前发生,我的问题是,如果(2)实际上在(1),1或2之前发生,那么A的值是什么?
答案 0 :(得分:2)
A
和B
是内存中的位置。但是,B+1
操作不会在内存中发生,而是在CPU中发生。具体来说,作者正在描述这两个操作。
A = B + 1
(1)
B
(0
)中的值已加载到CPU寄存器1
1
)中的值被写入存储器位置A
B = 1
(2)
1
被写入内存位置B
发生之前要求读取B
(步骤A1)发生在写入B
(步骤B1)之前。但是,其余操作没有相互依赖性,可以重新排序而不会影响结果。这些序列中的任何一个都会产生相同的结果
答案 1 :(得分:0)
作者似乎意味着执行顺序不必与编写语句的顺序相匹配。
程序动作的重新排序可以由JVM或CPU来执行,而这两者您几乎无法控制。
问题在于,在Java中,您只能依赖Java内存模型所保证的内容,而不能依赖源代码中语句的顺序。