Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,
兩個不同的線程總是看到某個成員變量的同一個值。
Java語言規范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
這樣當多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。
而volatile關鍵字就是提示VM:對于這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。
使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。
由于使用volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。
就跟C中的一樣 禁止編譯器進行優化~~~~
在并發中可保證內存一致性
volatile聲明的變量只在主存中存儲
讀取的時候,會有讀取臟數據的情況發生
但是寫數據的時候,是能保證數據能正確寫入
volatile只保證每次都從主存拿數據,其他保證不了什么吧?
告訴編譯器不要使用緩存
非long、double變量不能保證原子性,非volatile變量不能保證內存可見性。
volatile 還能防止reorder...
就是內存屏蔽,防止指令重拍
其實目的就是保證可見性
可以操作volatile...變量 但是不代表你的操作指令是原子的