一直以來沒能理解爲什麼static不能代替volatile,同時volatile的可見性到底是怎麼一回事?
查閱了相關資料:
1。首先要明確static是幹嘛的,static成員變量在類初次被加載的時候初始化,而且在內存中只有一份,所有實例共享,也就是大家都是操作的同一個變量,但是他是不能保證線程安全的。這個可以寫個小demo,很好證明。
2。static 和 volatile是描述不同維度的關鍵字,兩個並不衝突。volatile的變量對所有線程保證其可見性,但是不能保證原子性。
3。上面最後一句話可以這麼理解,多線程環境下對volatile變量(比如:Integer)的自增運算是非線程安全的。但是set和get操作是線程安全的。
4。volatile有兩點特性:
1,任何的線程對volatile變量的修改都會強制更新到主內存,使其他線程取到最新的值,這就是可見性。
2,保證其他線程對變量的修改操作都已完成,且後來的修改也必須在本次修改之後。
5。因爲Integer的自增運算是三部完成,先讀取數據到本地(get),本地+1,寫入主內存(set)。基於上面第4點,且這幾個操作不是連續的,本地+1操作期間可能就存在主內存中的值被其他線程修改,所以是非線程安全的。