java記憶體模型

2021-08-25 22:26:01 字數 596 閱讀 6688

執行緒之間的共享變數儲存在主記憶體中,每個執行緒對應乙個私有的本地變數為共享變數的副本

指令重排序

資料依賴性

as-if-serial

乙個執行緒的操作必須按照程式的順序來執行

每個操作必須原子性和立刻對所有執行緒可見

允許把乙個64位的double和long型別的寫操作拆分成兩個32位操作來執行,任意讀操作必須具有原子性。

對volatile的讀-寫操作可以實現執行緒之間的通訊;與鎖的釋放獲取具有相同的記憶體效果

寫的記憶體語義

讀的記憶體語義

小結 volatile重排序規則

鎖釋放與獲取記憶體語義

初次讀final域物件的引用與隨後初次讀這個final域兩個操作不能重排序

策略 乙個執行緒的執行結果需要對另乙個操作可見

定義 規則

監視器鎖規則

volatile變數規則

start()規則

join() 規則

雙重檢查鎖定與延遲初始化

各個模型之間的關係

對舊模型的修補

增強final

參考

java記憶體模型

一 原子性 原子性是指乙個操作是不可中斷的,即使是多個執行緒一起執行的時候,乙個操作的開始,就不會被其他執行緒干擾 那麼有人會想到 i 是原子操作嗎?答案肯定不是。因為i 至少包含兩個操作,讀 從記憶體中讀出來 和行為 加上去 還有可能把加完後的資料在方法到i裡面去,出來也是1,這兩個執行緒同時進行...

Java記憶體模型

1.首先,執行緒a把本地記憶體a中更新過的共享變數重新整理到主記憶體中去。2.然後,執行緒b到主記憶體中去讀取執行緒a之前已更新過的共享變數。1.共享物件對各個執行緒的可見性 2.共享物件的競爭現象 指令級並行的重排序 如果不存l在資料依賴性,處理器可以改變語句對應機器指令的執行順序。記憶體系統的重...

Java記憶體模型

int x 0 thread a int y x thread bint x 5 int y 8 int z x y 關於上面的 存在這樣關係 x和z之間存在資料依賴關係,同時y和z之間也存在資料依賴關係。為了得到正確的結果,執行指令序列時,z不能重排序到x和y的前面。但是x和y之間並沒有資料依賴關...