volatile原理-指令重排序

內容參考自《深入理解java虛擬機》

1 保證可見性。volatile修飾的變量每次使用時,都會刷新工作內存,從主內存取出最新值

2 禁止指令重排序

指令重排序

  • 爲了使cpu多核處理器高效利用,會對輸入的代碼進行亂序執行。比如a=1,b=1,處理器執行時可能是b=1,a=1。
    處理完成後,cpu會對執行結果進行重組,保證和順序執行一樣。在多線程時就是不安全的了
  • 從硬件上來說指令重排序是指cpu採用了允許將多條指令不按程序規定的順序發送給各相應的電路單元處理。
    但是不是隨意重排,有依賴關係的不能重排。比如a=1,a=a+1 這時候就不能進行重新排序。

實現原理-指令

volatile變量賦值的操作指令前面加上lock指令操作,由lock指令實現了內存可見性和禁止指令重排序。例如lock add1 $0x0,(%esp)。具體指令可以寫一段代碼反編譯看看

lock指令:

  • 將本cpu的緩存寫入內存中,由於緩存一致性的緣故,其它cpu的緩存失效了,下一次取值從主內存取。即內存可見性
  • 將緩存寫入內存中,這意味着之前的操作完成,這時候是不能將volatile變量賦值操作指令後面的程序指令排到前面去的。

爲什麼i++不是原子性的
因爲i++是兩條指令:1 取出i放入棧頂 2 對i進行運算加1。 在取出i並運算的時候i的值可能被其它cpu修改了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章