volatile實現原理

2021-08-27 05:42:45 字數 1165 閱讀 7394

via:yzwall技術筆記

volatile變數寫,彙編指令會多出lock字首,lock字首在多核處理器下的作用:

針對編譯器重排序:jmm針對編譯器指定了volatile重排序規則表,規定哪些先後操作不能進行編譯器重排序:

針對處理器重排序:編譯器在生成位元組碼指令時,通過在指令序列中插入記憶體屏障指令來禁止特定型別的處理器重排序,以實現volatile記憶體語義:volatile底層通過記憶體屏障指令實現

在每個volatile變數寫操作之前插入storestore屏障,之後插入storeload屏障;

之前插入storestore屏障:禁止volatile寫之前的寫操作與其重排序,保證之前的所有寫操作都寫回主存,對volatile寫可見;

之後插入storeload屏障:禁止volatile寫之後的讀寫操作與其重排序,實現volatile寫結果對後續操作可見;

在每個volatile變數讀操作之後,接連插入loadload屏障,loadstore屏障;

插入loadload屏障:禁止volatile變數讀之後的讀操作與其重排序;

插入loadstore屏障:禁止volatile變數讀之後的寫操作與其重排序;

通過插入兩次記憶體屏障,實現volatile讀結果對後續操作可見;

jmm通過上述記憶體屏障插入策略,保證在任意平台上volatile的記憶體語義一致;

volatile用來修飾共享變數(成員變數,static變數)表明:

volatile變數寫:當寫乙個volatile變數時,jmm會把所有執行緒本地記憶體的對應變數副本重新整理回主存;

volatile寫和解鎖記憶體語義相同;

volatile變數讀:當讀乙個volatile變數時,jmm會設定該執行緒的volatile變數副本(本地記憶體中)無效,執行緒只能從主存中讀取該變數;

保證了volatile變數讀,總能看見對該volatile變數最後的修改;

volatile變數讀和加鎖記憶體語義相同;

volatile實現原理

首先我們來討論一種情況,現在有兩個執行緒,乙個是讀執行緒,讀取乙個共享資料並列印,乙個是寫執行緒,更新共享資料,這樣乙個情形的原理是什麼樣的?這樣會出現乙個什麼樣的問題呢?就是乙個寫執行緒將資料讀取到記憶體更新的時候,讀執行緒去讀取這個資料,導致讀寫執行緒的資料不一致。這個有什麼解決方案呢?主存中的...

Java併發 volatile的實現原理

synchronized 是乙個重量級的鎖,volatile通常被比喻成輕量級的synchronized volatile是乙個變數修飾符,只能用來修飾變數。volatile寫 當寫乙個volatile變數時,jmm會把該執行緒對應的本地記憶體中的共享變數重新整理到主記憶體。volatile讀 當讀...

併發程式設計 volatile底層實現原理

解決可見性使用快取一致性。防止指令重排序使用記憶體屏障,保證有序性。有volatile變數修飾的共享變數,編譯時會有lock字首。lock字首指令會引起處理器快取回寫到記憶體。匯流排鎖 快取鎖 乙個處理器的快取回寫到記憶體會導致其他處理器的快取無效。mesi 嗅探 處理器上有一套完整的協議,來保證 ...