2015-06-19 73 views
6

我在我的類中的下列:對volatile變量的原子操作是簡單的getter調用嗎?

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

是調用getCounter原子,或不?

+0

是。 Thatz是揮發性的目的。好奇地看我的理解是否正確...... –

+2

實際上,volatile的目的是爲了確保線程對volatile變量的任何寫入都會被其他線程的後續讀取看到。讀/分配一個字節是原子的,有或沒有volatile。 –

+3

請注意,這種推理不適用'長'和'雙' –

回答

10

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

但是,你必須volatile上雙重或長值,以避免越來越不一致讀取既不老也不是新的價值:

Java編程語言內存模型的目的,對非易失性long或double值的單次寫入被視爲兩次單獨寫入:每次寫入32位一半。這可能會導致線程看到來自一次寫入的64位值的前32位和來自另一次寫入的第二次32位。

鼓勵實施Java虛擬機,以避免在可能的情況下分割64位值。鼓勵程序員將共享的64位值聲明爲volatile或正確同步其程序以避免可能的複雜情況。

來源:JLS8 section 17.7

+1

@RealSkeptic對,我沒有在OP的帖子中找到'volatile'關鍵字。 – hexafraction

相關問題