不知寫volatile變量將迫使JVM所有非volatile變量同步到內存中,因此,例如,將下面的代碼會發生什麼:寫入volatile變量後會發生什麼?
volatile int x;
int y;
y=5;
x=10;
x將被寫入到存儲器,但是y會發生什麼?它會被寫入內存嗎?
不知寫volatile變量將迫使JVM所有非volatile變量同步到內存中,因此,例如,將下面的代碼會發生什麼:寫入volatile變量後會發生什麼?
volatile int x;
int y;
y=5;
x=10;
x將被寫入到存儲器,但是y會發生什麼?它會被寫入內存嗎?
是的,在the Java Language Specification (third edition) -- in particular section 17.4.4的規則下 - 如果看到新值x
的每個線程都會隨後看到新值y
,如果他們試圖讀取它。不讀取x
的線程不保證會受到影響。
但是,請注意,此保證不存在於JLS的第二版版本的內存模型中。在那裏,易失性讀取和寫入對非易失性存儲器訪問的排序沒有影響。
對於所有無法將語言版本的版本映射到實際Java版本的人員:這意味着Henning所描述的從Java 1.5開始就是真實的; ) – Voo
y沒有聲明爲volatile ...? –
不,有意故意將其聲明爲不穩定。問題是如果寫入volatile變量意味着所有變量的內存屏障。 – Anonymice
我認爲這將取決於您的Java版本... –