2012-07-11 14 views
9

Ho letto da Effective Java che in assenza di sincronizzazione la seguente sequenza A può essere convertita in sequenza B dalla macchina virtuale e questo è chiamato hoisting. Ho anche letto da qualche parte che se le variabili non sono dichiarate come istruzioni volatili che coinvolgono le variabili possono essere riordinate. Stai issando e riordinando la stessa cosa?Stai issando e riordinando la stessa cosa?

while (!done) sequence A  
    i++; 

    if (!done) 
    while (true) sequence B 
     i++; 
+0

possibile duplicato di [perché l'hotspot ottimizzerà quanto segue usando il sollevamento?] (Http://stackoverflow.com/questions/9338180/why-hotspot-will-optimize-the-following-using-hoisting) –

risposta

13

Sono leggermente diversi.

Il sollevamento di significa che è stata interrotta un'operazione da un ciclo perché il ciclo stesso non influisce sul risultato dell'operazione. Nel tuo caso, stai sollevando il test condizionale dal ciclo while.

Riordinare significa cambiare la sequenza di istruzioni in un modo che non influisce sul risultato. In genere, si tratta di istruzioni adiacenti senza dipendenze di dati, ad es. non importa quale ordine si eseguono le seguenti due istruzioni:

int a = x; 
int b = y; 
0

Riordino riguarda le prestazioni di esecuzione dove come riordino non influisce sulle prestazioni.

Il sollevamento viene eseguito per il riordino delle istruzioni della barriera di memoria.

1

Il termine "riordino" come viene utilizzato nel modello di memoria Java fa riferimento a tutte le possibili ottimizzazioni che possono influire sulla correttezza di programmi sincronizzati impropriamente.

Quindi, il riordino in questo senso è un termine generico che include ottimizzazioni come sollevamento, effetti di esecuzione fuori servizio, incongruenze causate dalla gerarchia di memoria (cioè cache) e così via.

Problemi correlati