Java™ 語言包含兩種內在的同步機制:同步塊(或方法)和 volatile 變量。這兩種機制的提出都是爲了實現代碼線程的安全性。其中 Volatile 變量的同步性較差(但有時它更簡單而且開銷更低),並且其使用也更容易出錯。
之因此要單獨提出volatile這個不經常使用的關鍵字緣由是這個關鍵字在高性能的多線程程序中也有很重要的用途,只是這個關鍵字用很差會出不少問題。
首先考慮一個問題,爲何變量須要volatile來修飾呢?
要搞清楚這個問題,首先應該明白計算機內部都作什麼了。好比作了一個i++操做,計算機內部作了三次處理:讀取-修改-寫入。
一樣,對於一個long型數據,作了個賦值操做,在32系統下須要通過兩步才能完成,先修改低32位,而後修改高32位。
假想一下,當將以上的操做放到一個多線程環境下操做時候,有可能出現的問題,是這些步驟執行了一部分,而另一個線程就已經引用了變量值,這樣就致使了讀取髒數據的問題。
經過這個設想,就不難理解volatile關鍵字了。
volatile能夠用在任何變量前面,但不能用於final變量前面,由於final型的變量是禁止修改的。也不存在線程安全的問題。