2012-04-02 11 views
15

我想我理解單變量發生之前的關係。如果我編寫一個易失性字段,則此字段的所有後續讀取都將包含此新值。編寫一個volatile跨越內存屏障並將新值刷新到主內存。Java內存模型 - 在穿越內存屏障時到底是什麼沖刷到內存?

我仍然不清楚在所有其他情況下會發生什麼 - 例如Thread.start(),​​或java.util.concurrent中的新鎖。這是什麼意思,他們也跨越記憶障礙?哪些數據從本地緩存刷新到主內存?換句話說,穿越的範圍是什麼?

的一切總是被刷新?現在回到volatile,它不僅僅是單一的volatile字段?

回答

12

當跨越內存屏障時,JVM將所有本地(在當前線程的上下文中)緩存變量與主內存同步。除此之外,它還會刪除主內存中標記爲髒的所有本地緩存​​數據。

關於揮發性 - 是的,它也同步的一切與主內存,不僅是單一的揮發性場本地緩存(自1.5)

http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml

+0

好一點。我改變了語言。 – 2012-04-02 21:17:36

+0

另外,您應該提及它會刪除在中央內存中髒的任何緩存存儲。對不起,挑剔。這是一個很好的問題。 – Gray 2012-04-02 21:19:19

+0

@Gray能否詳細說明(或提供鏈接)在主內存中的髒緩存?它是什麼? – 2012-04-02 21:29:58