volatile 爲什麼安全?又爲什麼不安全?

今天刷到了併發的文章,講到了 volatile 關鍵字,忽然被這個問題給搞懵逼了:

    1. volatile 的可見性讓修改的值立馬讓其他線程可見,意味着所有線程拿到變量的值都是最新的,這毋庸置疑!

    2. volatile 在併發情況下是線程不安全的,意味着其他線程拿到的值可能不是最新的,這。。。也是毋庸置疑!

我。。太南了!!!!

 

真相大白:可見性的確可以保證線程拿到的值是最新的,分析情況:i = 1、flag = true、、、各種修改

    1. 讀:線程讀的時候,大家都讀,沒問題;

    2. 寫:有線程寫,內存屏蔽,寫完之後,立馬更新到主存,內存開放,其他線程繼續讀或者寫。

還有點懵逼?沒事,咱再來看看:併發 => 程不安全,這種情況:i ++、x + y 、、、各種運算

    1. 讀:線程讀,也是讀,肯定沒問題;

    2. 寫:i ++ ,先讀 i 的值,再進行 ++,加完後寫回主存。

那麼問題就會出現了,都知道,i ++ 在彙編上來細講是會分成好幾個步驟的,不安全的原因也是在這裏,

這時候有同學就會發問了,不是有 volatile 關鍵字保證了他的可見性了嗎?爲什麼會有問題?

答:其實不是這樣的,i ++ 運算是先讀,再寫,volatile 是保證了你讀這個步驟,讀完之後你做什麼操作與它無關。

        也就是說,你讀到的這個值肯定是和別人讀到的一樣的,但是別人讀完之後有沒有改,那就不一定咯。

 

總結:綜上所述,volatile 關鍵字的可見性是確保 單次讀 或者 單次寫 的情況不會出錯,但是不能保證複雜操作的安全,例如:算術運算

    

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