java基礎,多線程環境下static,volatile關於線程安全的理解。

一直以來沒能理解爲什麼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操作期間可能就存在主內存中的值被其他線程修改,所以是非線程安全的。

           

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章