java併發編程實戰對volatile的解釋就是:當一個域聲明爲valatile類型後,編譯器與運行時會監視這個變量:它是共享的,並且對它的操做不會與其餘的內存操做一塊兒被重排序。volatile變量不會緩存在寄存器或者緩存在對其餘處理器隱藏的地方。
表示呵呵噠。html
官方解釋:若是一個字段被聲明成volatile,java線程內存模型確保全部線程看到這個變量的值是一致的。
在volatile聲明的變量進行寫操做的時候,JVM幹了一件事,在前面加上了Lock爲前綴的彙編代碼。
咱們先看下多處理器的高速緩存,再說加Lock會發生什麼。
每一個CPU會緩存主存的共享變量,從而提升處理效率。因此共享變量在每一個CPU上都會有一份緩存。java
多處理器下,Lock爲前綴的彙編代碼發生下面兩件事情。
1.讓當前緩存行寫回到主存中。
2.爲當前緩存行加入緩存一致性協議。(效果就是:其餘處理器會將該緩存行置爲失效)編程
MESI協議。確保多處理器下緩存是一致的。具體的協議內容能夠自行百度,監聽+廣播+狀態的控制去實現的。緩存
http://www.importnew.com/2786...
寫的時候加了StroeLoad內存屏障,StroeLoad基於Lock指令實現的,因此編譯後會有Lock爲前綴的指令併發
以上說明了volatile的可見性。任何修改,其餘線程是可見的。同時也說明的java併發編程實戰的解釋不許確,甚至是錯誤的。volatile修飾的變量仍是會緩存的,只是經過一系列處理保證了全部線程看到這個變量的值是一致的jvm