volatile,本意是不穩定的,易揮發的,也就是說,用它修飾的變量時可變的,那麼這個關鍵字有什麼用呢?
在多線程環境下,線程可以將線程間共享的變量保存在本地內存(如寄存器)中,而不是從內存中讀取,這就可能會引發不一致的問題,另一個進程可能在此線程運行期間改變了變量的值,而此線程並沒有看到變化。
而volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
Java語言規范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
也就是說,JVM會對線程變量的訪問進行優化,這樣當多個線程同時與某個對象時交互,就必須要注意到要讓線程及時的得到共享成員變量的變化。
而volatile關鍵字就是提示VM:對於這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。
使用建議:
1.在兩個或者更多的線程訪問的成員變量上使用volatile
2.當要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用
3.volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字