volatile關鍵字及jmm記憶體模型

2021-10-02 16:46:38 字數 825 閱讀 4623

計算機指令都是在cpu中執行的,在指令執行過程中必定伴隨著大量的讀取和寫入操作,那個程式執行時的資料時存放在記憶體的,隨著cpu的更新換代,記憶體的速度已經遠遠的跟不上cpu的速度,這使得cpu的讀取寫入效率非常低。為了解決這一問題,在cpu與記憶體間都以cpu快取記憶體作為中轉。也就是在cpu在執行指令時,將主存中的資料複製到cpu快取記憶體中,隨指令運算完畢後,將結果重新整理回主記憶體。

在多執行緒中,每個執行緒都會將共享變數從主記憶體複製乙份到自己的工作記憶體,當執行緒1進行資料變更時,變更的則是自己工作記憶體中的共享變數副本,而不是主記憶體的共享變數,此時執行緒2中並不會感知到執行緒1的變化,這就是多執行緒時產生的資料不一致,即多執行緒時的資料不可見性。

當共享變數通過volatile修飾時,會開啟mesi快取一致性協議以及cpu嗅探機制。

mesi快取一致性協議:多個cpu在主記憶體讀取資料到各自的快取記憶體中,當其中乙個cpu修改了快取中的資料,該資料會立馬寫回主記憶體,其他cpu通過cpu嗅探機制可以感知到資料的變化從而將各自的快取記憶體中的資料設定為失效,再從主記憶體中重新讀取資料。

注意的是,當其中乙個執行緒的共享變數副本進行改變時,在進行store操作前,會為主記憶體加鎖,同時其他cpu的cpu嗅探機制已經感知到共享變數的變更,則會將各自的共享變數副本設定為無效,並重新向主記憶體獲取共享變數,但此時主記憶體還是處於鎖定狀態故而必須在此等待,等待修改變數的執行緒進行write操作將資料寫入主記憶體後,才會釋放鎖,此時其他cpu才能夠讀取到主記憶體的最新值。

關鍵字 volatile關鍵字的作用

1.volatile關鍵字是防止在共享的空間發生讀取的錯誤。只保證其可見性,不保證原子性 使用volatile指每次從記憶體中讀取資料,而不是從編譯器優化後的快取中讀取資料,簡單來講就是防止編譯器優化。2.在單任務環境中,如果在兩次讀取變數之間不改變變數的值,編譯器就會發生優化,會將ram中的值賦值...

關鍵字volatile詳解

與關鍵字const一樣,關鍵字volatile也是乙個型別修飾符 type specifier 關於volatile的作用 例如程式清單 volatile int m 10 int k,n m k i volatile將告訴編譯器,整形變數m是隨時發生變化的,每次使用m的時候,都要求從m的位址中找出...

volatile關鍵字 詳解

volatile 關鍵字 volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volati...