volatile 關鍵字只能用于修飾變量妻枕,無法用于修飾方法。并且 volatile 只能保證可見性泞当,但不能保證操作的原子性洪鸭。
在具體編程中體現(xiàn)為:volatile 只能保證基本類型以及一般對象的引用賦值是線程安全的。
volatile工作原理
為什么 volatile 只能保證可見性蒜撮,不能保證原子性呢暴构?這跟它的工作原理有關。
-
線程寫 volaitle 變量的步驟為:
改變線程工作內存中 volatile 變量副本的值
將改變后的副本的值從工作內存刷新到主內存
-
線程讀 volatile 變量的步驟為:
從主內存讀取 volatile 變量的最新值到線程的工作內存中
從工作內存中讀取 volatile 變量的副本
由于在整個過程沒有涉及到鎖相關的操作段磨,所以無法保證原子性取逾,但是由于實時刷新了主內存中的變量值,因此任何時刻苹支,不同線程總能看到該變量的最新值砾隅,保證了可見性。
volatile使用場景
要在多線程中安全的使用 volatile 變量债蜜,必須同時滿足:
-
對變量的設置操作不依賴其當前值
- 不滿足舉例:number++晴埂、count = count + 5
- 滿足舉例: boolean 變量等
-
該變量沒有包含在具有其他變量的不等式中
- 不滿足舉例:不變時 low < up
在實際項目中,由于很多情況下都不滿意 volatile 的使用條件寻定,所以 volatile 使用的場景并沒有 synchronized 廣邑时。
本文由猿必過 YBG 發(fā)布
禁止未經授權轉載,違者依法追究相關法律責任
如需授權可聯(lián)系:zhuyunhui@yuanbiguo.com