2012-05-03 39 views
7

我看到這個在Java規格:java的排序和內存模型

如果X和Y是相同的線程和x的行動來之前在程序順序y,則x和y之前發生。

和也在本

原始代碼
線程1
R2 = A;
B = 1;

有效編譯器變換(編譯器被允許重新排序在任一線程的指令,當這不影響在隔離該線程的執行)
線程1
B = 1;
r2 = A;

我對這兩件事感到困惑。
如果動作x出現在動作y之前,那麼x應該在y之前發生。如果我們認爲r2 = A代表x,B = 1代表y,r2 = A應該在B = 1之前發生。怎麼可能有任何重新排序,如果x在y爲真之前發生,在r2 = A之前如何執行B = 1?

回答

13

的JLS 專門Section 17.4.5帶來了這一點:

應當指出的是,兩個動作之間的之前發生關係的存在並不一定意味着他們必須要發生的順序在一個實現中。如果重新排序產生與法定執行一致的結果,則不是非法的。

如果有幫助,替換「之前發生」與無處不在的規格「wurfles」,讓你的直覺意味着什麼不發揮作用。您預期在規範中不存在保證 - 由於命名,我懷疑。

+0

根據JLS的說法:JIT決定如果兩個事件之間沒有依賴關係(如果它們是獨立的),則不需要*之前發生*。該段落指出JIT優化是否正確? – TheLostMind

+0

@TheLostMind:那麼,無論是JIT優化還是隻是JIT不會*刪除* CPU優化 –

+0

在這種情況下,*最終*,a *發生在*不存在之前。我在這裏聞到* escape分析的手:P – TheLostMind