1. 程式人生 > >從計算機的角度理解volatile關鍵字

從計算機的角度理解volatile關鍵字

極簡計算機發展史

我們知道,計算機CPU和記憶體的互動是最頻繁的,記憶體是我們的快取記憶體區。而剛開始使用者磁碟和CPU進行互動,CPU運轉速度越來越快,磁碟遠遠跟不上CPU的讀寫速度,才設計了記憶體,但是隨著CPU的發展,記憶體的讀寫速度也遠遠跟不上CPU的讀寫速度,因此,為了解決這一糾紛,CPU廠商在每顆CPU上加入了快取記憶體,用來緩解這種症狀,因此,現在CPU同記憶體互動就變成了下面的樣子。

在這裡插入圖片描述

單核CPU的效能不可能無限制的增長,要想很多的提升新能,需要多個處理器協同工作。 基於快取記憶體的儲存互動很好的解決了處理器與記憶體之間的矛盾,也引入了新的問題:快取一致性問題。在多處理器系統中,每個處理器有自己的快取記憶體,而他們又共享同一塊記憶體(下文成主存,main memory 主要記憶體),當多個處理器運算都涉及到同一塊記憶體區域的時候,就有可能發生快取不一致的現象。為了解決這一問題,需要各個處理器執行時都遵循一些協議,在執行時需要用這些協議保證資料的一致性。
在這裡插入圖片描述

快取一致性協議中最出名的就是Intel 的MESI協議,MESI協議保證了每個快取中使用的共享變數的副本是一致的。它核心的思想是:當CPU寫資料時,如果發現操作的變數是共享變數,即在其他CPU中也存在該變數的副本,會發出訊號通知其他CPU將該變數的快取設定為無效狀態,因此當其他CPU需要讀取這個變數時,發現自己快取中快取該變數的快取行是無效的,那麼它就會從記憶體重新讀取

Java記憶體模型

Java的記憶體模型和上面的結構還是挺相似的,此時在看本地記憶體和主記憶體關係,從邏輯上,快取記憶體對應本地記憶體,每個執行緒分配到CPU時間片時,獨自享有快取記憶體的使用能力。主記憶體對應儲存的實體記憶體。特別注意,這只是邏輯上的對等關係,物理的上具體對應關係十分複雜,這裡不討論。
在這裡插入圖片描述

參考部落格

[1]https://mp.weixin.qq.com/s/MIsQv8ZWWBzfB-Qhg3l4lA
[2]https://www.cnblogs.com/dolphin0520/p/3920373.html
[3]https://www.cnblogs.com/dingyingsi/p/3760447.html
[4]https://juejin.im/post/5ad1adea6fb9a028c67624e9
[5]https://www.jianshu.com/p/fb15ef257945