簡體   English   中英

在java4和java5中使用volatile關鍵字

[英]using volatile keyword in java4 and java5

在java4和java5中使用volatile keyword什么區別?

與此相關,

非原子變量(long / double)的讀/寫操作在聲明為volatile時是原子的。

這對java4也是如此, 或者從java5開始有效嗎?

是,有一點不同。
編譯器可以針對任何先前的讀取或寫入重新排序Java 4 volatile ,從而導致細微的並發錯誤,例如使得無法實現double check鎖定(Singleton的非常常見的習慣用法)。
這在Java 5.0中得到修復,它擴展了volatile的語義,不再對任何后續的讀或寫進行重新排序,並引入了新的內存模型。 您可以閱讀此Double Checked Locking作為示例參考

這個網站很好地解釋了這些差異: http//www.javamex.com/tutorials/synchronization_volatile.shtml

他們還在單獨的頁面上解釋了Java 5中volatile的行為: http//www.javamex.com/tutorials/synchronization_volatile_java_5.shtml

人們提出了好的觀點和參考,回答了我的問題,回答了第一部分。

具體到問題的第二部分,我在一些論壇上讀到:

揮發性聲明long是原子的(也是Java 5之前的版本),因為它保證(對於所有JVM實現)讀或寫直接轉到主內存而不是兩個32位寄存器。

在Java 5之前,volatile 應該為long和double提供這樣的保證。 然而事情並沒有在實踐中以這種方式發揮作用,並且實施經常違反此保證。 我記得這個問題似乎已經解決了JDK 1.4,但由於他們仍然在處理整個內存模型的事情,他們並沒有真正做出任何關於它的明確公告,直到新規則宣布的JDK 5和內存保證實際意味着什么。

這是來自Java語言規范,第二版

17.4雙和長的非原子療法

對volatile變量的加載,存儲,讀取和寫入操作都是原子的,即使變量的類型是double或long。

在java4和java5中使用volatile關鍵字有什么區別?

JDK5之前的JMM被破壞,並且對JDK4使用volatile可能無法提供預期的結果。 有關更多信息,請訪問http//www.ibm.com/developerworks/library/j-jtp02244/

非原子變量(long / double)的讀/寫操作在聲明為volatile時是原子的。

長/雙讀/寫發生在兩個獨立的32位操作中。 對於兩個線程,一個線程可能讀取更高的32位,而另一個線程讀取長/雙變量的低32位。 簡而言之,讀取/寫入long不是原子操作,與其他原語不同。 使用volatile for long / double應該提供這樣的保證,因為volatile的指令不會被編譯器重新排序用於易失性讀/寫,而volatile也提供可見性保證。 但同樣,它可能不適用於JDK 4或之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM