Java 記憶體模型 (JMM) 是 Java 並發程式設計的一個基本但經常被誤解的面向。 JMM 是隨 Java 5 引入的,它定義了執行緒如何與記憶體交互,確保多執行緒程式的一致性和可預測性。在本文中,我們將深入探討 JMM,探討其關鍵概念,並研究它如何影響並發 Java 應用程式開發。
1。能見度
可見性涉及確保一個執行緒所做的變更對其他執行緒可見。如果沒有適當的機制,由於編譯器或 CPU 最佳化,執行緒可能會無限期地向其他執行緒隱藏其變更。
2.調度
調度是指指令執行的順序。出於效能原因,JMM 允許某些重新排序,但也保證某些順序以維護程式語義。
3.原子性
原子性保證操作在單一不可分割的步驟中執行,而不會受到其他執行緒的干擾。
1。發生在關係之前
這是JMM的基礎。如果操作 A 「發生在」操作 B 之前,則確保 A 的效果對 B 可見。這種關係是傳遞性的,構成了 Java 中同步的基礎。
2.易揮發的
volatile 關鍵字確保更改在執行緒之間可見。對易失性變數的讀取將始終看到對該變數執行的最後一次寫入。
3.同步
synchronized 區塊和方法在取得和釋放相同監視器的執行緒之間建立發生前關係。
4。最終的
正確初始化的final欄位保證對所有執行緒可見,無需額外同步。
1。雙重檢查鎖定
由於可見性問題,雙重檢查鎖定模式在 Java 5 之前就被破壞了。 JMM 修復了這個問題,允許正確使用 volatile.
class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
2.發布對象
安全的物件發布對於避免部分可見性問題至關重要。 JMM 保證如果一個物件被正確發布(例如,透過易失性欄位或執行緒安全性類別),則其所有欄位都將可見。
3.重組指令
JMM 允許進行某些重組,這可能會讓開發人員感到驚訝。
例如:
int a, b; a = 1; b = 2;
可以重新排列為:
int a, b; b = 2; a = 1;
除非這些指令被適當的時間障礙包圍。
Java 記憶體模型是 Java 並發程式設計的重要面向。儘管很複雜,但理解它對於編寫正確且高效的並發程式碼至關重要。透過掌握可見性、調度和原子性的概念,以及發生之前、易失性和同步等機制,開發人員可以創建一個健壯且高效的多執行緒應用程式。
然而,值得注意的是,即使對 JMM 有很好的理解,並發程式設計仍然是一個挑戰。使用 java.util.concurrent 套件提供的高級抽象通常可以簡化開發,同時仍利用 JMM 保證。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3