Я знаю, что произойдет, прежде чем не означает, что произошло раньше, может код "A = B + 1; B = 1;" выдать результат "A == 2 и B == 1"? - PullRequest
0 голосов
/ 12 ноября 2018

В этой статье автор упоминает, что «случается раньше - не значит случаться раньше», и он приводит пример для объяснения.

int A = 0;
int B = 0;

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

Он говорит, что (2) действительно может произойти до (1). Мой вопрос заключается в том, каково будет значение A, если (2) действительно произойдет до (1), 1 или 2?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

A и B - это места в памяти.Однако операция B+1 не происходит в памяти, она происходит в процессоре.В частности, автор описывает эти две операции.

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).Однако остальные операции не имеют взаимозависимости и могут быть переупорядочены без ущерба для результата.Любая из этих последовательностей приведет к одинаковому результату

  • А1, В1, А2, А3
  • А1, А2, В1, А3
  • А1, А2, А3,B1
0 голосов
/ 12 ноября 2018

Автор, похоже, имеет в виду, что порядок выполнения не должен совпадать с порядком, в котором написаны операторы.

Переупорядочивание действий программы может выполняться либо JVM, либо CPU, оба изкоторый у вас мало контроля.

Дело в том, что в Java вы можете полагаться только на то, что гарантирует модель памяти Java, а не на порядок операторов в исходном коде.

...