我從Effective Java中讀出,在沒有同步的情況下,下面的序列A可以被虛擬機轉換成序列B,這被稱爲hoisting
。我也在某處讀到,如果變量沒有被聲明爲變量的volatile指令可以被重新排序。是提升和重新排序相同的東西?提升和重新排序相同的東西?
while (!done) sequence A
i++;
if (!done)
while (true) sequence B
i++;
我從Effective Java中讀出,在沒有同步的情況下,下面的序列A可以被虛擬機轉換成序列B,這被稱爲hoisting
。我也在某處讀到,如果變量沒有被聲明爲變量的volatile指令可以被重新排序。是提升和重新排序相同的東西?提升和重新排序相同的東西?
while (!done) sequence A
i++;
if (!done)
while (true) sequence B
i++;
它們略有不同。
吊起意味着您已將一些操作從循環中拉出,因爲循環本身不會影響操作的結果。在你的情況下,你提出了while循環的條件測試。
重新排序表示以不影響結果的方式改變指令的順序。典型地,這將是沒有數據依賴性的相鄰指令,例如,這不要緊,你執行以下兩個報表時的順序:
int a = x;
int b = y;
重新排序涉及到執行,其中作爲重排不影響性能的表現。
提升完成重新排序內存屏障指令。
Java內存模型中使用的術語「重新排序」是指所有可能的優化,這些優化可能會影響不正確同步的程序的正確性。
因此,從這個意義上說,重新排序是一個通用術語,包括優化,如提升,無序執行的影響,由內存層次結構(即緩存)引起的不一致性等。
可能重複[爲什麼熱點會優化以下使用吊裝?](http://stackoverflow.com/questions/9338180/why-hotspot-will-optimize-the-follow-using-hoisting) – 2014-09-02 13:48:38