1. 程式人生 > >多行程環境下使用volatile修飾變數在就真的安全了麼?

多行程環境下使用volatile修飾變數在就真的安全了麼?

      volatile生效的關鍵是快取一致性協議,在修改變數的時候通知其他已讀取快取的執行緒此變數已經修改,觸發其他執行緒對變數快取的重新讀取,以此保證資料不會髒讀 。但是這裡有個問題,修改也就是往記憶體寫變數的時候才會觸發檢查。而多執行緒環境下變數安全的標誌是(原子性,可見性,有序性),這裡只實現了可見性。變數操作的過程包括讀取到快取中和操作後寫入磁碟兩個操作,寫入磁碟可以保證其他執行緒立刻獲取最新的內容,但是讀取到快取卻不能保證。也就是說volatile只能保證具有原子性或者不依賴當前讀取到快取內容的變數的安全性。所以,volatile並不是併發中萬能的變數安全保護傘,想要不出問題還是要根據實際情況使用不同的方法,例如加鎖。要注意,加鎖是要慎重又慎重,重則死鎖,輕則頻繁的解鎖上鎖也是讓人無法接受的 。