volatile特性
可以把對volatile變量的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步
可以看成
所以volatile變量自身具有下列特性:
可見性。對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最后的寫入。
原子性:對任意單個volatile變量的讀/寫具有原子性,但類似於volatile++這種復合操作不具有原子性。
volatile雖然能保證執行完及時把變量刷到主內存中,但對於count++這種非原子性、多指令的情況,由於線程切換,線程A剛把count=0加載到工作內存,線程B就可以開始工作了,這樣就會導致線程A和B執行完的結果都是1,都寫到主內存中,主內存的值還是1不是2。
volatile的實現原理
volatile關鍵字修飾的變量會存在一個“lock:”的前綴。
Lock前綴,Lock不是一種內存屏障,但是它能完成類似內存屏障的功能。Lock會對CPU總線和高速緩存加鎖,可以理解為CPU指令級的一種鎖。
同時該指令會將當前處理器緩存行的數據直接寫會到系統內存中,且這個寫回內存的操作會使在其他CPU里緩存了該地址的數據無效。