Long和double需要64位內存。這導致這些類型需要兩個地址空間。Long,Double和64位內存
在64位JVM的是,這仍然是這樣嗎?由於這些值現在可以適合單個地址空間,因此這意味着這些類型現在存儲在單個地址空間中嗎?
這是否對線程有影響,在這些類型上需要使用volatile來確保 每個單獨的地址空間不會亂序更新?
Long和double需要64位內存。這導致這些類型需要兩個地址空間。Long,Double和64位內存
在64位JVM的是,這仍然是這樣嗎?由於這些值現在可以適合單個地址空間,因此這意味着這些類型現在存儲在單個地址空間中嗎?
這是否對線程有影響,在這些類型上需要使用volatile來確保 每個單獨的地址空間不會亂序更新?
這仍然是這種情況。 JVM規範,未改變64位的JVM:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7
哇!我認爲這個問題很久以前就消失了。 – OldCurmudgeon
@OldCurmudgeon - 它在實踐中,但不是在規範中。 – jtahlborn
@jtahlborn然後沒有必要使用volatile,因爲這些類型存儲在一個64位塊,即使spec說不同? –
Java的應該是虛擬機獨立:所以這意味着Java程序總是執行同樣的方式,不管它的方式在虛擬機實現... –
@CommuSoft嚴格來說,這是不正確的。你得到同樣的保證。但這些擔保沒有涵蓋的內容可以自由更改。所以64位虛擬機允許(實際上鼓勵)把'double'和'long'寫成原子,但是你不能保證它會發生。 – biziclop
參考先前的回答像http://stackoverflow.com/questions/25173208/value-integrity-guarantee-for-concurrent-long-writes-in-64-bit-openjdk-7-8 – JiriS