volatile變量修飾的共享變量在進行寫操作的時候回多出一行彙編:
0x01a3de1d:movb $0×0,0×1104800(%esi);0x01a3de24:lock addl $0×0,(%esp);
Lock前綴的指令在多核處理器下會引發兩件事情。
1)將當前處理器緩存行的數據寫回到系統內存。
2)這個寫回內存的操作會使其他cpu裏緩存了該內存地址的數據無效。
多處理器總線嗅探:
爲了提高處理速度,處理器不直接和內存進行通信,而是先將系統內存的數據讀到內部緩存後再進行操作,但操作不知道何時會寫到內存。如果對聲明瞭volatile的變量進行寫操作,JVM就會想處理器發送一條lock前綴的指令,將這個變量所在緩存行的數據寫回到系統內存。但是在多處理器下,爲了保證各個處理器的緩存是一致的,就會實現緩存緩存一致性協議,每個處理器通過嗅探在總線上傳播的數據來檢查自己的緩存值是不是過期了,如果處理器發現自己緩存行對應的內存地址唄修改,就會將當前處理器的緩存行設置無效狀態,當處理器對這個數據進行修改操作的時候,會重新從系統內存中把數據庫讀到處理器緩存中。