, По крайней мере, это мое понимание этого.
у этот пост в связи сГлубокое понимание изменчивости в 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
гарантии:
Каждое действиепосле энергозависимая нагрузка не будет переупорядочена до того, как энергозависимая нагрузка станет видимой.
Я вижу, ты пишешь:
Должна быть последовательная последовательность
Но я не могу понять, почему требуется последовательная согласованность.