volatile關鍵字
@Date 2016.06.20
共享變量
- 多個線程之間能夠被共享的變量
- 存放在堆內存中的實例變量,靜態變量,數組變量
內存屏障
- CPU指令,用於實現對內存操作的順序限制
Volatile
- 確保所有線程看到這個變量的值是一致的
- 不會引起線程上下文的切換和調度
- JVM就會向處理器發送一條Lock前綴的指令
- 緩存一致性協議: 當處理器發現自己緩存行對應的內存地址被修改,會將當前處理器的緩存行設置成無效狀態
- 將當前處理器緩存行的數據會寫回到系統內存
- 寫回內存的操作會引起在其他CPU裏緩存了該內存地址的數據無效
- 大多數處理器高速緩存行是64個字節寬
- 保證了可見性(對於一個變量i,多個線程同時去操作(比如++),i的值一定是0->1->2->3,而如果不加volatile則i的值可能是0->1->1->2)
- 不保證順序性和原子性(volatile不會鎖住變量,你再對第一個變量i做完操作之後,下一個volatile變量j可能已經發生改變了)
補充
- 強制線程去主存中讀取Heap的信息
- 在併發時可以保證讀取的最新的,但是不能保證對變量的操作是互斥以及順序執行的