初步認識Volatile 總結可見性的本質

2021-10-12 17:45:57 字數 452 閱讀 5431

由於cpu快取記憶體的出現使得 如果多個cpu同時快取了相同的共享資料時,可能存在可見性問題。也就是cpu0修改了自己本地快取的值對於cpu1不可見。不可見導致的後果是cpu1後續在對該資料進行寫入操作時,是使用的髒資料。使得資料最終的結果不可**。 

很多同學肯定希望想在**裡面去模擬一下可見性的問題,實際上,這種情況很難模擬。因為我們無法讓某個執行緒指定某個特定cpu,這是系統底層的演算法, jvm應該也是沒法控制的。還有最重要的一點,就是你無法**cpu快取什麼時候會把值傳給主存,可能這個時間間隔非常短,短到你無法觀察到。最後就是執行緒的執行的順序問題,因為多執行緒你無法控制哪個執行緒的某句**會在另乙個執行緒的某句**後面馬上執行。

所以我們只能基於它的原理去了解這樣乙個存在的客觀事實 了解到這裡,大家應該會有乙個疑問,剛剛不是說基於快取一致性協議或者匯流排鎖能夠達到快取一致性的要求嗎?為什麼還需要加volatile關鍵字?或者說為什麼還會存在可見性問題呢?

重新認識volatile

併發程式設計 肯定是為了更合理充分的利用多核cpu架構的效能 cpu 主頻率遠遠高於主存,所以引入cpu快取,cpu載入資料無法繞過快取,而且對於多核cpu,一級快取不是共享的,二級和 快取是執行緒共享的!cpu計算的資料並不是直接從主存中去拿,而且通過層層在快取中尋找。下圖是乙個單cpu多核心的架...

初步認識Volatile 什麼叫快取一致性呢?

首先,有了快取記憶體的存在以後,每個cpu的處理過程是,先將計算需要用到的資料快取在cpu快取記憶體中,在cpu進行計算時,直接從快取記憶體中讀取資料並且在計算完成之後寫入到快取中。在整個運算過程完成後,再把快取中的資料同步到主記憶體。由於在多cpu種,每個執行緒可能會執行在不同的cpu內,並且每個...

初步認識繼承

include stdafx.h include using namespace std 構造方式跟類內類物件是一樣的 父類 info 派生類 sci 派生類 sci 父類 info struct info 父類 void outputinfo info info private int numb ...