2012-05-03 15 views
7

que estoy viendo esto en las especificaciones de Java:java reordenamiento y la memoria modelo

Si x e y son las acciones de la misma rosca y X viene antes y el fin del programa, entonces x sucede antes y.

y también esta

código original
Thread 1
r2 = A;
B = 1;

transformación compilador válido (compiladores se les permite cambiar el orden de las instrucciones, ya sea en hilo, cuando esto no afecta a la ejecución de dicho hilo en forma aislada)
Thread 1
B = 1;
r2 = A;

Estoy confundido con esas dos cosas.
si una acción x viene antes de una acción y luego x debe ocurrir antes de y. si consideramos que r2 = A para xy B = 1 para y, r2 = A debe ocurrir antes que B = 1. ¿Cómo puede haber algún reordenamiento, cómo se ejecuta B = 1 antes de que r2 = A si x sucede antes de que y sea verdadero?

Respuesta

13

Section 17.4.5 del JLS específicamente resalta esto:

Hay que señalar que la presencia de una relación que ocurre antes de las dos acciones no implica necesariamente que tienen que llevarse a cabo en ese orden en una implementación. Si el reordenamiento produce resultados consistentes con una ejecución legal, no es ilegal.

Si ayuda, reemplazar "sucede antes" con "wurfles" en todas partes en la especificación, por lo que su intuición sobre lo que significa no entrar en juego. Esperas garantías que no están presentes en la especificación, sospecho que debido a la nomenclatura.

+0

En base a lo que dice el JLS: El JIT decide que un * Sucede antes * no es necesario si no hay dependencia entre dos eventos (si son independientes) ¿no ?. Este párrafo apunta a que las optimizaciones de JIT son correctas. – TheLostMind

+0

@TheLostMind: Bueno, optimizaciones JIT o simplemente el JIT no * eliminación * optimizaciones de CPU –

+0

En ese caso, * eventualmente *, un * sucede antes de que * no exista. Huelo la mano del * análisis de escape * en este: P – TheLostMind

Cuestiones relacionadas