記錄學習內容。看網路上大大們的文章和影片,做些紀錄。
以下內容大多來自網路上大大們的文章。
還不太了解,內容可能有錯誤。
Java Memory Model in 10 minutes
內容講到, 一個core執行 寫得動作 , 另一個core執行 讀的動作 。
因為在寫得只有更新自己的cache ,還沒更新到共同的cache 。
所以讀的時候 ,還會讀到之前的 ,造成資料不一致 。
所以java有volatile 這個語法 ,當寫的時候 ,會更新共同的cache。
也可以用 lock 和 synchronized 鎖住一個變數 ,達到這個效果。
如圖,因為在寫的時候,只寫到registers 或 L1 Cache ,還沒寫到共同的L2 、L3 cache或RAM,所以讀的時候,還不會讀到更新後的資料 。
如圖,執行緒有共用的cache,也有自己的local cache 。 如果只有寫到自己的cache,會造成資料不一致
接著來看:
Using volatile vs AtomicInteger in Java concurrency
volatile 是解決 寫 的時候 一定要 寫到 共同的cache 。
但不能解決這個問題 :
一個執行緒 寫+1 ,另一個執行緒寫+1
,但是 結果 不是+2。
因為volatile 只有這個功能: 寫 的時候 一定要 寫到 共同的cache 。
但是當一條 執行緒 在 其他執行緒 都還沒寫得時候 ,已經取得之前的資料了 。還是會造成 最後 寫出來的東西 不是我們預期的。
如圖,這時候的volatile是沒有用的:
所以 解決這個問題的方法 就是: 鎖住 一個變數 , 這個變數 一次 只能 一個人去用他 。可以用AtomicInteger 這個語法。