首页 > 解决方案 > 我知道happens-before并不意味着发生在之前,代码“A = B + 1; B = 1;”可以吗?产生结果“A == 2 and B == 1”?

问题描述

这篇文章中,作者提到“Happens-Before 并不意味着 Happening Before”,并举例说明。

int A = 0;
int B = 0;

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

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

标签: javajava-memory-model

解决方案


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

推荐阅读