由詹姆斯·高斯林通過JLS去,我碰到這個 -Java內存模型如何確保所有線程都看到變量的一致值?
附帶的Java編程語言提供了一個第二機制,揮發性領域,比鎖定更方便一些(比同步等)目的。
的字段可以聲明揮發性,在這種情況下,Java內存模型確保看到一致的值爲變量。於是筆者點this資源的所有線程。
它可能會出現的結果r2 == 2
和r1 == 1
是不可能的。 但爲什麼?
是不是非常有意義想的東西像這 -
Instruction 4 : A = 2;
Instruction 1 : r2 = A;
Instruction 2 : B = 1;
Instruction 3 : r1 = B;
而其餘的我也不明白。
可能會出現結果r2 == 2和r1 == 1是不可能的。 直觀上,指令1或指令3應該先執行 。如果指令1至上,它不應該是能夠 看到寫在指令4.如果指令3至上,它 不應該能夠看到寫在指令2.
如果某些執行此次展出的行爲,那麼我們就知道 指令4出現在指令1之前,指令1之前出現在指令3之前的指令 2之前,該指令在指令4之前。 這就是它的表面上荒謬的。
但是,編譯器可以重新排序 線程中的指令,但這並不影響該線程在執行該線程時的隔離。如果指令1按照指令2重新排序,如表17.4-B中的跟蹤中所示的 ,則很容易看出結果r2 == 2和r1 == 1是否可能發生。
請舉例說明。
您的問題是? – Sam
我真的沒有在那裏看到具體的問題。你能指出你不明白的第一件事嗎?您粘貼的文本似乎是您希望我們提供示例的完美例子! –
@大衛:用粗體和斜體。但爲什麼? –