JVM記憶體中的主記憶體與工作記憶體即CAS
阿新 • • 發佈:2019-02-01
每個執行緒有自己的工作空間,稱之為棧,而每個棧元素(棧幀)對應一個方法,這個棧幀裡邊又會分為區域性變數、計數器等等區域。
每次new的時候,物件會分配在堆,也就是主記憶體,執行緒是通過拷貝副本的方式把變數從主記憶體到工作記憶體。
至於volatile,他是為了解決可見性的問題,剛才說了執行緒會拷貝副本,那麼假如多個執行緒同時操作一個物件,他們把副本值更新回主記憶體的時候就會有執行緒安全問題,而用volatile修飾的變數代表讓工作執行緒每次取和賦值都直接從主記憶體操作,而不是通過工作記憶體副本
同時,對於synchronized,它的語義不僅僅是在同一個訊號上的互斥(mutex),也包含執行緒和主存之間資料互動的同步,它確保在多處理器、多執行緒下對記憶體能有可預見的一致性檢視。獲取或釋放鎖會觸發一次記憶體屏障(memory barrier)--強迫執行緒本地記憶體和主存同步。當一個執行緒退出一個synchronized block時,觸發一次寫屏障(write barrier )--在釋放鎖前必須把所有在這個同步塊裡修改過的變數值重新整理到主存;同樣,進入一個synchronized block時,觸發一次讀屏障(read barrier)--讓本地記憶體失效,必須從主存中重新獲取在這個同步塊中將要引用的所有變數的值。正確使用同步能保證一個執行緒能以可預見的方式看到另一個執行緒的結果,執行緒對同步塊的操作就像是原子的。“正確使用”的含義是:必須是在同一個鎖上同步。
這就解釋了為啥雙重判斷鎖的單例模式是執行緒安全的, 它並不需要新增volatile欄位。
CAS : compare and swap .
CAS涉及到預期值,主記憶體值,更新值 。 當且僅當預期值==主記憶體值時候,才會將主記憶體值更新為更新值 。 具體例子可以自己看看 java.util.concurrent.atomic下的原子類。