我在我的類中的下列:對volatile變量的原子操作是簡單的getter調用嗎?
private static volatile byte counter = 0;
public static byte getCounter() {return counter;}
是調用getCounter
原子,或不?
我在我的類中的下列:對volatile變量的原子操作是簡單的getter調用嗎?
private static volatile byte counter = 0;
public static byte getCounter() {return counter;}
是調用getCounter
原子,或不?
是的,這是一個原子操作,在這種意義上說,不可能有重新排序或定時,這會導致字節在被部分寫入時被讀取。如果字節在讀取時被重新分配,則getter保證返回before或after值,但沒有其他值,即使沒有volatile
。
但是,你必須有volatile
上雙重或長值,以避免越來越不一致讀取既不老也不是新的價值:
Java編程語言內存模型的目的,對非易失性long或double值的單次寫入被視爲兩次單獨寫入:每次寫入32位一半。這可能會導致線程看到來自一次寫入的64位值的前32位和來自另一次寫入的第二次32位。
鼓勵實施Java虛擬機,以避免在可能的情況下分割64位值。鼓勵程序員將共享的64位值聲明爲
volatile
或正確同步其程序以避免可能的複雜情況。
@RealSkeptic對,我沒有在OP的帖子中找到'volatile'關鍵字。 – hexafraction
是。 Thatz是揮發性的目的。好奇地看我的理解是否正確...... –
實際上,volatile的目的是爲了確保線程對volatile變量的任何寫入都會被其他線程的後續讀取看到。讀/分配一個字節是原子的,有或沒有volatile。 –
請注意,這種推理不適用'長'和'雙' –