我知道,before-before并不意味着在此之前发生,代码“ A = B + 1; B = 1;”可以吗?产生结果“ A == 2和B == 1”?

时间:2018-11-12 15:00:30

标签: java java-memory-model

this article中,作者提到“之前发生并不意味着之前发生”,他展示了一个示例进行解释。

int A = 0;
int B = 0;

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

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

2 个答案:

答案 0 :(得分:2)

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

A = B + 1(1)

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

B = 1(2)

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

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

  • A1,B1,A2,A3
  • A1,A2,B1,A3
  • A1,A2,A3,B1

答案 1 :(得分:0)

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

程序动作的重新排序可以由JVM或CPU来执行,而这两者您几乎无法控制。

问题在于,在Java中,您只能依赖Java内存模型所保证的内容,而不能依赖源代码中语句的顺序。