1. 程式人生 > >Java 併發 --記憶體模型

Java 併發 --記憶體模型

記憶體模型—JMM

原始碼中的指令順序和實際執行時的指令順序可能是不同的,編譯器出於優化的目的,會對指令進行「重排序」,會採用亂序或並行等方式來執行指令,它只要滿足一個條件即可:「程式的最終結果與在嚴格序列環境中執行的結果相同」。在這種情形下,如果另一個執行緒坐在那觀察某個執行過程中的執行緒,會發現該執行緒的執行過程是不可預測的,在這個時候得到的狀態也是無效的,這就是安全釋出的必要性。
除此之外,JMM 中每個執行緒有自己的本地的快取(也就是下圖中的工作記憶體),如果某個執行緒更新變數之後沒有及時同步到主記憶體,其他執行緒是看不到更新後的值的,這就帶來可見性的問題,但這在快取一致性的要求上是滿足最小保證的:允許不同的處理器再任意時刻從同一個儲存位置上看到不同的值。

  1. 如果我們要保證執行操作 B 的執行緒看到操作 A 的結果,那麼在 A 和 B 之間必須滿足先行發生原則(happens-before)
  2. 管程鎖定規則(Monitor Lock Rule):同一個鎖的 unlock 操作先行發生於後面(時間上先後)的 lock 操作
  3. volatile 變數規則(Volatile Variable Rule):對一個 volatile 變數的寫操作先行發生於後面(時間上先後)對這個變數的讀操作。

類載入模型

  • A 載入B 時 載入不到 B
    • 這時 B 類剛載入到記憶體,還有進行賦值 操作,而A 的引用指向了B
    • 使用 happenbefre,在A 類載入完後在載入B