使用volatile修飾符修飾共享變量(類的成員變量或者類的靜態成員變量)會產生兩個效果:緩存
1:保證了不一樣線程對這個變量操做的可見性,即:一個線程修改了這個變量的值,修改結果對其餘線程是當即可見的;線程
2:禁止指令重排序;排序
使用volatile關鍵字,會強制性的將修改的值當即寫入主存;當線程2進行修改時,會致使線程1的工做內存中緩存變量stop緩存內存
行無效(反映到硬件層的話,就是cpu的L1或者L2緩存中對應的緩存行無效);因爲線程1的工做內存中緩存變量的緩存行無效,虛擬機
因此線程1再次讀取變量stop的值時,會去主存讀取。效率
下面這段話摘自《深刻理解Java虛擬機》:變量
「觀察加入volatile關鍵字和沒有加入volatile關鍵字時所生成的彙編代碼發現,加入volatile關鍵字時,會多出一個lock前綴指令」硬件
lock前綴指令實際上至關於一個內存屏障(也成內存柵欄),內存屏障會提供3個功能:cpu
1)它確保指令重排序時不會把其後面的指令排到內存屏障以前的位置,也不會把前面的指令排到內存屏障的後面;即在執行到內存屏障這句指令時,在它前面的操做已經所有完成;top
2)它會強制將對緩存的修改操做當即寫入主存;
3)若是是寫操做,它會致使其餘CPU中對應的緩存行無效。
volatile不等同於synchronized,synchronized防止多個線程同時訪問同一段代碼,影響執行效率;volatile關鍵字沒法保證原子性;