首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入理解Java內存模型(三):順序一致性、數據競爭與同步程序語義保證

     編輯:Java 相關知識

數據競爭定義與順序一致性承諾

數據競爭三要素:

  1. 一線程寫變量
  2. 另一線程讀同一變量
  3. 寫讀未通過同步排序

JMM 核心承諾:正確同步的程序執行具備順序一致性——結果與順序一致性模型中執行結果相同。同步含廣義同步原語(lock、volatile、final)。

順序一致性內存模型(SC)特徵

  1. 單線程操作按程序順序執行
  2. 所有線程見單一全局操作順序,每操作原子執行且立即對所有線程可見

SC模型視圖

概念模型:單一全局內存 + 擺動開關串行化所有線程內存訪問。

同步程序在 SC 與 JMM 中的執行對比

class SynchronizedExample {
    int a = 0; boolean flag = false;
    synchronized void writer() { a = 1; flag = true; }
    synchronized void reader() { if (flag) { int i = a; } }
}

同步程序執行對比

  • SC:所有操作嚴格按程序順序串行
  • JMM:臨界區內允許重排(提升效率),但 JMM 在鎖退出/進入點做特殊處理,保證線程在關鍵時間點具備 SC 相同內存視圖
  • 監視器互斥特性使線程 B 無法「觀察」到線程 A 臨界區內重排

JMM 實現方針:不改變正確同步程序結果前提下,最大化編譯器/處理器優化自由度。

未同步程序:SC vs JMM 差異

最小安全性保障

未同步程序:線程讀到的值要么是某線程寫入值,要么是默認值(0/null/false),杜絕「憑空產生」。JVM 堆分配對象前清零內存空間實現此保證。

總線機制與 64 位非原子性根源

總線工作機制

  • 總線仲裁串行化所有處理器內存訪問,單總線事務具原子性
  • 32 位處理器上 64 位讀寫拆分為兩個 32 位總線事務 → 失去原子性
  • Java 語言規範鼓勵但不強制 64 位原子性

64位非原子後果

後果:處理器 B 可能讀到處理器 A「寫一半」的無效值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性順序一致性模型JMM
整體執行順序無序(不可預知)無序(不可預知)
線程間見到的操作順序一致可能不一致(本地內存緩存導致)
單線程內操作順序保證程序順序不保證(臨界區內可重排)
64位讀寫原子性保證不保證(視JVM實現)