簡體   English   中英

正在 64 位虛擬機上編寫參考原子

[英]Is writing a reference atomic on 64bit VMs

Java 內存模型要求寫入int是原子的:也就是說,如果您在一個線程中向它寫入一個值(由 4 個字節組成)並在另一個線程中讀取它,您將獲得所有字節或沒有,但永遠不會獲得 2 個新字節和 2 個舊字節等。

這不能long保證。 在這里,將0x1122334455667788寫入之前保持為0的變量可能會導致另一個線程讀取0x1122334400000000x0000000055667788

現在規范不要求對象引用是 int 或 long-sized。 出於類型安全的原因,我懷疑它們可以保證以原子方式寫入,但是在 64 位 VM 上,這些引用可能是很好的 64 位值(僅僅是內存地址)。

現在這是我的問題:

  • 是否有任何內存模型規范涵蓋了這一點(我還沒有找到)?
  • 在 64 位虛擬機上,長時間寫入是否具有原子性?
  • 虛擬機是否被迫將引用映射到 32 位?

問候, 史蒂芬

讀/寫引用總是原子的

參見JLS 第 17.7 節:double 和 long 的非原子處理

就 Java 編程語言內存模型而言,對非易失性 long 或 double 值的單次寫入被視為兩次單獨的寫入:一次寫入每個 32 位一半。 這可能導致線程從一次寫入中看到 64 位值的前 32 位,而從另一次寫入中看到后 32 位的情況。

對 volatile long 和 double 值的寫入和讀取始終是原子的。

對引用的寫入和讀取始終是原子的,無論它們是作為 32 位還是 64 位值實現的。

某些實現可能會發現將 64 位 long 或 double 值上的單個寫入操作分成兩個相鄰 32 位值上的寫入操作很方便。 為了提高效率,這種行為是特定於實現的; Java 虛擬機的實現可以自由地以原子方式或分兩部分執行對 long 和 double 值的寫入。

鼓勵 Java 虛擬機的實現盡可能避免拆分 64 位值。 鼓勵程序員將共享的 64 位值聲明為易失性或正確同步他們的程序以避免可能的復雜性。

(強調)

AtomicReference

如果您想在舊值和新值之間進行協調,或者想要特定的記憶效應,請使用AtomicReference類。

例如, AtomicReference::getAndSet返回舊值,同時以原子方式設置新值,消除了另一個線程在兩個步驟之間進行干預的任何機會。 使用volatile內存語義

暫無
暫無

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

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