簡體   English   中英

是簡單的getter調用volatile變量原子操作嗎?

[英]Is simple getter call on volatile variable atomic operation?

我班上有以下內容:

private static volatile byte counter = 0;
public static byte getCounter() {return counter;}

getCounter的調用是否是原子的?

是的,這是一個原子操作,在某種意義上說,沒有重新排序或定時會導致在部分寫入時讀取字節。 如果在讀取字節時重新分配該字節,則保證getter返回before或after值,但不返回其他值 ,即使沒有volatile

但是,您必須在double或long值上具有volatile ,以避免獲得既不是舊值也不是新值的不一致讀取:

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

鼓勵Java虛擬機的實現避免在可能的情況下拆分64位值。 建議程序員將共享的64位值聲明為volatile或正確同步其程序以避免可能的復雜情況。

資料來源: JLS8第17.7節

暫無
暫無

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

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