volatile 關鍵字只能用於修飾變量,沒法用於修飾方法。而且 volatile 只能保證可見性,但不能保證操做的原子性。編程
在具體編程中體現爲:volatile 只能保證基本類型以及通常對象的引用賦值是線程安全的。安全
爲何 volatile 只能保證可見性,不能保證原子性呢?這跟它的工做原理有關。多線程
線程寫 volaitle 變量的步驟爲:線程
線程讀 volatile 變量的步驟爲:對象
因爲在整個過程沒有涉及到鎖相關的操做,因此沒法保證原子性,可是因爲實時刷新了主內存中的變量值,所以任什麼時候刻,不一樣線程總能看到該變量的最新值,保證了可見性。內存
要在多線程中安全的使用 volatile 變量,必須同時知足:it
對變量的設置操做不依賴其當前值變量
該變量沒有包含在具備其餘變量的不等式中原理
在實際項目中,因爲不少狀況下都不滿意 volatile 的使用條件,因此 volatile 使用的場景並無 synchronized 廣。引用