1.volatile與可見性
- A線程將共享變量讀進工作內存中,同時B線程也將共享變量讀進工作內存中。
- 在A線程對共享變量修改後,會立即刷新到主內存,此時B線程的工作內存中的共享變量就會被設置無效,需要從主內存中重新讀取新值。反映到硬件上就是CPU的Cache line 置爲無效狀態。
2.volatile與有序性
被volatile修飾的變量在底層會加一個“lock:”的前綴,帶"lock"前綴的指令相當於一個內存屏障,這恰恰是保證可見性與有序性的關鍵,該屏障的作用主要有一下幾點:
- 指令重排時,屏障前的代碼不能重排到屏障後,屏障後的也不能重排到屏障前。
- 執行到內存屏障時,確保前面的代碼都已經執行完畢,且執行結果是對屏障後的代碼可見的。
- 強制將工作內存中的變量刷新到主內存。
- 其它線程的工作內存的變量會設置無效,需要重現從主內存中讀取