Volatile原理解析

2021-09-28 23:28:04 字數 1253 閱讀 3328

乙個執行緒修改共享變數的之後,另外乙個線**的能夠馬上拿到變數的最新值嗎?我們來做乙個測試:

public class volatiletest_1  }}

});thread thread_2=new thread(new runnable()

});thread_1.start();

thread.sleep(1000);

thread_2.start();

}}

執行結果:

可以看到執行緒0一直在迴圈,那麼執行緒0並沒有到執行緒1更新的flag值。

那麼是什麼原因導致了記憶體不可見了呢?

cache快取:因為cpu的速度遠遠高於主記憶體的速度,為減少資源的浪費,在cup上又設定了多級的cache,而執行緒執行的時候會先將資料拷貝到執行緒內部的cache裡面,也就是工作記憶體(working memery),那麼多個執行緒訪問同乙個變數是就變成每個執行緒訪問自己的cache,變相導致了記憶體的不可見。

2.重排序:除了cache的原因就是,執行順序的重排序,導致執行緒a執行緒讀取某個變數的時候,執行緒b還沒將該變數的最新值寫會主記憶體。

解決快取一致性的操作有兩種

volatile的原理:有volatile修飾的共享變數進行寫操作的候會多出lock字首的指令,該指令在多核處理器下會引發兩件事情。

將當預處理器快取行資料刷寫到系統主記憶體。

這個刷寫回主記憶體的操作會使其他cpu快取的該共享變數記憶體位址的資料無效。

volatile的使用場景:狀態標記、double check

狀態標記的應用場景:比如上面舉的例子,用volatile修飾flag變數便能解決主存不可見的問題

double checked:雙重檢查的單例模式

public class singleton_01 

public static singleton_01 getsingleton_01() }}

return singleton_01;}}

volatile可見性原理解析

程式執行所需要的資料 讀操作 直接來自於記憶體,而修改變數值 寫操作 實際上有如下三步 1 將主存中的資料載入到快取中 2 對快取中的資料進行修改 3 將修改後的值重新整理到記憶體中 多個執行緒共同操作乙個變數,如下圖 第一步 執行緒1 執行緒2 執行緒3操作的是主存中的同乙個變數,並且分別交由cp...

LCD原理解析

硬體體系 3個部分 lcd液晶 屏 lcd驅動晶元 lcd控制器 整合在arm晶元內部 控制器 通過驅動晶元 控制液晶屏 液晶屏種類 stn gf tft tft 在嵌入式中較為常用 lcd控制器結構與模組 由17個可程式設計的暫存器組和一塊 256 16的調色盤內 存組成,通過這些暫存器,可以配置...

session原理解析

首先session跟cookies都是會會話進行跟蹤,session通過在伺服器端記錄資訊來記錄,cookies通過在客戶端記錄資訊來記錄。在此只對session進行分析 session是記錄在伺服器記憶體中的,每當乙個使用者通過瀏覽器第一次進行訪問時進行建立 需要注意只有訪問jsp,servlet...