La causalità in JMM sembra essere la parte più confusa di tutto ciò. Ho alcune domande relative alla causalità di JMM e comportamenti consentiti nei programmi concorrenti.Perché questo comportamento è consentito nel modello di memoria Java?
Come ho capito, l'attuale JMM proibisce sempre i loop di causalità. (Ho ragione?)
Ora, secondo il documento JSR-133, pagina 24, Fig.16, abbiamo un esempio in cui:
Inizialmente x = y = 0
filettatura 1:
r3 = x;
if (r3 == 0)
x = 42;
r1 = x;
y = r1;
filettatura 2:
r2 = y;
x = r2;
Intuitivamente, r1 = r2 = r3 = 42
sembra impossibile. Tuttavia, non è solo menzionato come possibile, ma anche "permesso" in JMM.
Per la possibilità, la spiegazione dal documento che non riesco a capire è:
Un compilatore potrebbe determinare che gli unici valori mai assegnati a
x
sono 0 e 42. Da questo, il compilatore potrebbe dedurre che, nel punto in cui eseguiamor1 = x
, sia avevamo appena eseguita una scrittura di 42 ax
, o avevamo appena lettox
e visto il valore 42. In entrambi i casi, sarebbe legale per una lettura dix
per vedere il valore 42. Potrebbe quindi cambiarer1 = x
ar1 = 42
; ciò consentirebbe di trasformarey = r1
iny = 42
ed eseguito in precedenza, determinando il comportamento in questione. In questo caso, la scrittura su viene inoltrata per la prima volta a .
La mia domanda è, che tipo di ottimizzazione del compilatore è davvero? (Sono un compilatore-ignorante.) Dal momento che 42 è scritto solo condizionatamente, quando l'istruzione if
è soddisfatta, come può il compilatore decidere di andare con la scrittura di x
?
In secondo luogo, anche se il compilatore fa questa ottimizzazione speculativa, e si impegna y = 42
e poi finalmente fa r3 = 42
, non è una violazione dei loop di causalità, in quanto non v'è alcuna causa ed effetto distinzione sinistra adesso?
In effetti c'è un esempio nello stesso documento (pagina 15, Figura 7) in cui un loop causale simile è menzionato come inaccettabile.
Quindi, come mai questo ordine di esecuzione è legale in JMM?
@Alexei Questo spiega un po '. Ma, il compilatore non dovrebbe renderlo 'r3 = 0' invece di' r3 = 42'? O stanno solo mostrando 'una possibilità'! – gaganbm
Il compilatore non rende 'r3 = 42', lascia solo' r3 = x' intatto. L'ottimizzazione del compilatore non viene sempre eseguita alla profondità massima. Se c'è una minima possibilità che l'ottimizzazione possa violare la correttezza, viene abbandonata. Nel codice indicato, non ci sono tali circostanze, ma possono apparire se è presente un altro codice. Inoltre, il compilatore può decidere che 'r3 = 0' ha lo stesso prezzo di' r3 = x'. –