volaite的作用:1保證變量對所有線程可見;2.禁止指令重排序
可見性是指:讀取時都從主內存讀取;修改後立即寫入主內存,使其他工作內存數據失效;
重排序:內存屏障會爲指令的執行提供以下保障
1.不會把後邊的代碼排到內存屏障之前;
2.不會把前門的代碼排到內存屏障之後;
3.在執行到內存屏障修飾的指令時前面的代碼全部執行完成;
4.強制將工作內存值的修改刷新至主內存;
5.如果是寫操作,會導致其他線程工作內存中的緩衝失效。
volatile實現原理
1)在volatile寫操作的前面插入一個StoreStore屏障,保證volatile寫操作不會和之前的寫操作重排序。
2)在volatile寫操作後邊插入一個SroreLoad屏障,保證volatile寫操作不會和之後的讀操作重排序。
3)在volatile讀操作的後邊增加一個loadLoad屏障+LoadStore屏障。保證volatile讀操作不會和之後的讀操作,寫操作重排序。