, По крайней мере, это мое понимание этого.

у этот пост в связи сГлубокое понимание изменчивости в Java

public class Main {
    private int x;
    private volatile int g;


    public void actor1(){
       x = 1;
       g = 1;
    }


    public void actor2(){
       put_on_screen_without_sync(g);
       put_on_screen_without_sync(x);
    }
}

Теперь я анализирую то, что JIT сгенерировал для приведенного выше фрагмента кода. Из нашего обсуждения в моем предыдущем посте мы знаем, что вывод1, 0 невозможно, потому что:

написать в volatilev вызывает, что каждое действиеa предшествующегоv вызывает этоa будет виден (будет сброшен в память) доv будет видно

   .................(I removed not important body of method).....

  0x00007f42307d9d5e: c7460c01000000     (1) mov       dword ptr [rsi+0ch],1h
                                                ;*putfield x
                                                ; - package.Main::actor1@2 (line 14)

  0x00007f42307d9d65: bf01000000          (2) mov       edi,1h
  0x00007f42307d9d6a: 897e10              (3) mov       dword ptr [rsi+10h],edi
  0x00007f42307d9d6d: f083042400          (4) lock add  dword ptr [rsp],0h
                                                ;*putfield g
                                                ; - package.Main::actor1@7 (line 15)

  0x00007f42307d9d72: 4883c430            add       rsp,30h
  0x00007f42307d9d76: 5d                  pop       rbp
  0x00007f42307d9d77: 850583535116        test      dword ptr [7f4246cef100h],eax
                                                ;   {poll_return}
  0x00007f42307d9d7d: c3                  ret

Правильно ли я понимаю, что это работает, потому что x86 не может сделатьStoreStore изменение порядка? Если бы это было возможно, это потребовало бы дополнительного барьера памяти, да?

Отредактировано после ОТЛИЧНО @ Ответ Евгения:

 int tmp = i; // volatile load
 // [LoadStore]
 // [LoadLoad]

Вот, я понимаю, что вы имеете в виду - понятноevery action below (after) изменчивое чтение (int tmp = i) не будет переупорядочено.

 // [StoreLoad] -- this one
 int tmp = i; // volatile load
 // [LoadStore]
 // [LoadLoad]

Здесь вы ставите еще один барьер. Это гарантирует нам, что никакие действия не будут переупорядоченыint tmp = i, Но почему это важно? Почему у меня есть сомнения? Из того, что я знаюvolatile load гарантии:

Каждое действиепосле энергозависимая нагрузка не будет переупорядочена до того, как энергозависимая нагрузка станет видимой.

Я вижу, ты пишешь:

Должна быть последовательная последовательность

Но я не могу понять, почему требуется последовательная согласованность.

Ответы на вопрос(0)

Ваш ответ на вопрос