J'ecrivais ce poste dans le cadre de Deep understanding of volatile in JavaAnalyse de la production x86 générée par JIT dans le contexte de volatilité
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);
}
}
Maintenant, j'analyse ce JIT généré pour pièce au-dessus du code. De notre discussion dans mon post précédent, nous savons que la production 1, 0
est impossible parce que:
écrire à v
volatile provoque que chaque action a
précède v
fait que a
sera visible (sera rincée à la mémoire) avant v
sera Être visible.
.................(I removed not important body of method).....
0x00007f42307d9d5e: c7460c01000000 (1) mov dword ptr [rsi+0ch],1h
;*putfield x
; - package.Main::[email protected] (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::[email protected] (line 15)
0x00007f42307d9d72: 4883c430 add rsp,30h
0x00007f42307d9d76: 5d pop rbp
0x00007f42307d9d77: 850583535116 test dword ptr [7f4246cef100h],eax
; {poll_return}
0x00007f42307d9d7d: c3 ret
Est-ce que je comprends bien que cela fonctionne parce que x86 ne peut pas faire StoreStore
réordonnancement? Si cela pouvait nécessiter une barrière de mémoire supplémentaire, oui?
ÉDITÉE APRÈS EXCELLENT @ réponse Eugene:
int tmp = i; // volatile load // [LoadStore] // [LoadLoad]
Ici, je vois ce que vous dire- il est clair: every action below (after)
lecture volatile (int tmp = i
) ne sera pas réorganisés.
// [StoreLoad] -- this one int tmp = i; // volatile load // [LoadStore] // [LoadLoad]
Ici, vous mettre une barrière plus. Il nous assure qu'aucune action ne sera réorganisée avec int tmp = i
. Mais, pourquoi est-ce important? Pourquoi j'ai des doutes? De ce que je sais volatile load
garanties:
Chaque action après charge volatile ne sera pas réorganisé avant que la charge volatile est visible.
Je vois que vous écrivez:
Il doit y avoir une cohérence séquentielle
Mais, je ne vois pas pourquoi est nécessaire cohérence séquentielle.
Qu'est-ce que 'a'? Quel 'v'? Voulez-vous dire «x» et «g»? – Andreas
Maintenant, 'a' est une action au-dessus de' v'- par exemple c'est une action: 'x = 1'. 'v' est un magasin:' g = 1' – Gilgamesz
Le JMM n'était pas fait pour x86 ou toute autre architecture spécifique et ne raisonne pas en termes de charge ou de magasin. Il est de la responsabilité d'une JVM de mettre en œuvre le JMM avec les instructions disponibles sur chaque architecture. – assylias