2012-05-03 14 views
7

sto vedendo questo nelle specifiche Java:java riordino e la memoria modello

se X e Y sono le azioni di uno stesso filo e x viene prima y al fine programma, quindi x accade prima di y.

e anche questo

codice originale
filettatura 1
r2 = A;
B = 1;

valida compilatore trasformazione (compilatori possono riordinare le istruzioni in entrambi filo, quando questo non pregiudica l'esecuzione di tale filo in isolamento)
filettatura 1
B = 1;
r2 = A;

Sono confuso con queste due cose.
se un'azione x precede un'azione y allora x dovrebbe accadere prima di y. se consideriamo r2 = A per xe B = 1 per y, r2 = A dovrebbe accadere prima di B = 1. Come può esserci un qualsiasi riordino, come mai B = 1 viene eseguito prima di r2 = A se x accade prima che y sia vero ?.

risposta

13

Section 17.4.5 della JLS specificamente porta questo fuori:

Va notato che la presenza di un rapporto accade-prima tra due azioni non implica necessariamente che devono avvenire in questo ordine in un'implementazione. Se il riordino produce risultati coerenti con un'esecuzione legale, non è illegale.

Se aiuta, sostituire "accade-prima" con "wurfles" ovunque nelle specifiche, in modo che la vostra intuizione su ciò che significa non entrare in gioco. Ti aspetti garanzie che non sono presenti nelle specifiche, a mio parere, a causa della denominazione.

+0

In base a ciò che dice JLS: La JIT decide che un * Happens before * non è necessario se non c'è dipendenza tra due eventi (se sono indipendenti) giusto ?. Questo paragrafo punta alle ottimizzazioni JIT corrette? – TheLostMind

+0

@TheLostMind: beh, ottimizzazioni JIT o solo JIT non * rimozione * Ottimizzazioni CPU –

+0

In tal caso, * alla fine *, a * accade prima * non esiste. Sento l'odore della * analisi di fuga * in questo: P – TheLostMind

Problemi correlati