2016-07-28 27 views
2

由詹姆斯·高斯林通過JLS去,我碰到這個 -Java內存模型如何確保所有線程都看到變量的一致值?

附帶的Java編程語言提供了一個第二機制,揮發性領域,比鎖定更方便一些(比同步等)目的。

的字段可以聲明揮發性,在這種情況下,Java內存模型確保看到一致的值變量。於是筆者點this資源的所有線程。

enter image description here

它可能會出現的結果r2 == 2r1 == 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是否可能發生。

請舉例說明。

+4

您的問題是? – Sam

+1

我真的沒有在那裏看到具體的問題。你能指出你不明白的第一件事嗎?您粘貼的文本似乎是您希望我們提供示例的完美例子! –

+0

@大衛:用粗體和斜體。但爲什麼? –

回答

0

這是英語寫作中常見的修辭模式。一位作家說,某些「可能出現」是這種情況,或者說某人「可能會認爲」某事是事實,他們解釋可能導致這一結論的無效推理,然後他們繼續解釋事實並非如此案子。使用這種修辭技巧,中間部分由作家已知的不正確的陳述組成。

您引用的部分旨在準確解釋您已經瞭解的內容 - 如果編譯器無法影響單線程代碼,則通常可以自由地對內存讀寫進行重新排序。

因此,例如,在本段中:

可能出現,其結果R2 == 2和r1 == 1是不可能的。直觀上,執行中應該首先執行指令1或指令3。如果指令1第一個出現,它就不應該能看到指令4處的寫入。如果指令3先到達,它就不應該看到指令2處的寫入。

「可能出現」他意味着有人可能會這樣想,但事實並非如此。然後,他繼續解釋爲什麼有人可能會這樣想,然後解釋爲什麼這是錯誤的。該段第一段之後的句子被作者誤認爲是錯誤的,然後他將繼續解釋他們是怎麼錯的。

+0

不是以英語爲母語的人。對我而言,這可能就像說/思考[看起來/表達可能性]。或者像這樣 - 看起來像結果r2 == 2和r1 == 1是不可能的,但它是可以實現的。 –

+0

「出現」一詞的意思是「看起來像」。它類似於「似乎」。它並不表明它實際上是可能的,只是人們可能會認爲它是可能的。 –

相關問題