有volatile變量修飾的共享變量進行寫操做的時候,會多出一行以Lock爲前綴的彙編代碼,編程
這個前綴指令會在多核處理器下引起兩件事情:緩存
1.將當前處理器緩存行的數據寫回到系統內存。併發
2.這個寫回內存的操做會使在其餘CPU裏緩存了該內存地址的數據無效。內存
爲了提升處理速度,CPU不直接和內存進行通訊,而是先將系統內存的數據讀到內部緩存後再進行操做,變量
但操做完不知道什麼時候會寫回到內存。配置
上圖: 最簡單的高速緩存配置圖im
Main Memory——系統內存d3
Bus——總線通信
Cache——處理器緩存數據
CPU Core——處理器核
若是對聲明瞭volatile的變量進行寫操做,JVM就會向處理器發送一條Lock前綴的指令,將這個變量所在緩存行的數據寫回到系統內存。
可是,就算寫回到內存,若是其餘處理器緩存的值仍是舊的,再執行計算操做就會有問題。
因此在多處理器下,爲了保證各個處理器的緩存是一致的,就會實現緩存一致性協議,
每一個處理器經過嗅探在總線上傳播的數據來檢查本身緩存的值是否是過時了,
當處理器發現本身緩存行對應的內存地址被修改,就會將當前處理器的緩存行設置成無效狀態,
當處理器對這個數據進行修改操做的時候,就會從新從系統內存中把數據讀到處理器緩存裏。
——參考自《Java併發編程的藝術》