volitale 關鍵字

一、前言

volitale 知識點主要涉及JAVA內存模型的知識點,volitale提供了內存可見性和禁止指令重排的功能。

參考文章:https://blog.csdn.net/eff666/article/details/67640648

二、知識點

1.內存可見性

        對變量進行訪問和賦值時,觀察加入volatile關鍵字和沒有加入volatile關鍵字時所生成的彙編代碼發現,加入volatile關鍵字時,會多出一個lock前綴指令。lock前綴指令實際上相當於一個內存屏障(也成內存柵欄),內存屏障會提供3個功能:

     (1)它確保指令重排序時不會把其後面的指令排到內存屏障之前的位置,也不會把前面的指令排到內存屏障的後面;即在執行到內存屏障這句指令時,在它前面的操作已經全部完成;

     (2)它會強制將對緩存的修改操作立即寫入主內存;

     (3)如果是寫操作,它會導致其他CPU中對應的緩存行無效。

        處理器爲了提高處理速度,不直接和內存進行通訊,而是將系統內存的數據獨到內部緩存後再進行操作,但操作完後不知什麼時候會寫到內存。

如果對聲明瞭volatile變量進行寫操作時,JVM會向處理器發送一條Lock前綴的指令,將這個變量所在緩存行的數據寫會到系統內存。這一步確保瞭如果有其他線程對聲明瞭volatile變量進行修改,則立即更新主內存中數據。

但這時候其他處理器的緩存還是舊的,所以在多處理器環境下,爲了保證各個處理器緩存一致,每個處理會通過嗅探在總線上傳播的數據來檢查 自己的緩存是否過期,當處理器發現自己緩存行對應的內存地址被修改了,就會將當前處理器的緩存行設置成無效狀態,當處理器要對這個數據進行修改操作時,會強制重新從系統內存把數據讀到處理器緩存裏。 這一步確保了其他線程獲得的聲明瞭volatile變量都是從主內存中獲取最新的。

2.禁止指令重排

  • 禁止指令重排的概念是:使用volitale變量所在代碼作爲一個界限,其前面的代碼不能重新調整到後面,後面的也不能調整到前面。但是不能保證其前面的代碼不會出現重新排序的情況,後面也是一樣。
  • volitale 通過內存屏障實現 禁止指令重排
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章