iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

學習筆記系列 第 18

Java 、volatile

  • 分享至 

  • xImage
  •  

記錄學習內容。看網路上大大們的文章和影片,做些紀錄。
以下內容大多來自網路上大大們的文章。
還不太了解,內容可能有錯誤。

Java Memory Model in 10 minutes

內容講到, 一個core執行 寫得動作 , 另一個core執行 讀的動作 。

因為在寫得只有更新自己的cache ,還沒更新到共同的cache 。

所以讀的時候 ,還會讀到之前的 ,造成資料不一致 。

所以java有volatile 這個語法 ,當寫的時候 ,會更新共同的cache。

也可以用 lock 和 synchronized 鎖住一個變數 ,達到這個效果。

如圖,因為在寫的時候,只寫到registers 或 L1 Cache ,還沒寫到共同的L2 、L3 cache或RAM,所以讀的時候,還不會讀到更新後的資料 。
https://ithelp.ithome.com.tw/upload/images/20200913/20111994ci4xQc7NUG.png

如圖,執行緒有共用的cache,也有自己的local cache 。 如果只有寫到自己的cache,會造成資料不一致
https://ithelp.ithome.com.tw/upload/images/20200913/20111994FlvpTwYYLr.png

接著來看:
Using volatile vs AtomicInteger in Java concurrency

volatile 是解決 寫 的時候 一定要 寫到 共同的cache 。

但不能解決這個問題 :
一個執行緒 寫+1 ,另一個執行緒寫+1
,但是 結果 不是+2。

因為volatile 只有這個功能: 寫 的時候 一定要 寫到 共同的cache 。
但是當一條 執行緒 在 其他執行緒 都還沒寫得時候 ,已經取得之前的資料了 。還是會造成 最後 寫出來的東西 不是我們預期的。

如圖,這時候的volatile是沒有用的:
https://ithelp.ithome.com.tw/upload/images/20200913/20111994lhmpbIGgGr.png

所以 解決這個問題的方法 就是: 鎖住 一個變數 , 這個變數 一次 只能 一個人去用他 。可以用AtomicInteger 這個語法。


上一篇
Leetcode 1192 Critical Connections in a Network
下一篇
0/1 Knapsack Problem 、Fractional Knapsack Problem
系列文
學習筆記46
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言