Java併發-順序一致性模型

順序一致性模型

順序一致性內存模型有兩大特性
1)一個線程中的所有操作必須按照程序的順序來執行。
2)(不管程序是否同步)所有線程都只能看到一個單一的操作執行順序。在順序一致性內存模型中,每個操作都必須原子執行且立刻對所有線程可見
這裏寫圖片描述

在概念上,順序一致性模型有一個單一的全局內存,這個內存通過一個左右擺動的開關可以連接到任意一個線程,同時每一個線程必須按照程序的順序來執行內存讀/寫操作。在任意時間點最多隻能有一個線程可以連接到內存。

假設兩個線程A,B併發執行,其中A線程有3個操作,它們在程序中的順序是:A1-A2-A3。其中B線程也有3個操作,它們在程序中的順序是:B1-B2-B3。

假設兩個線程使用監視器鎖來正確同步:
這裏寫圖片描述

假設這兩個線程沒有做同步:
這裏寫圖片描述

在JMM中就沒有這個保證。未同步程序在JMM中不但整體的執行順序是無序的,而且所有線程看到的操作執行順序也可能不一致。

順序一致性模型與JMM的區別

1.順序一致性模型保證單線程內的操作會按程序的順序執行,而JMM不保證單線程內的操作會按程序的順序執行。(比如正確同步的多線程程序在臨界區內的重排序)
2.順序一致性模型保證所有線程能看到一致的操作執行順序,而JMM不保證所有線程能看到一致的操作執行順序。
3.JMM不保證對64位long型和double型變量的寫操作具有原子性,而順序一致性模型能保證對所有的內存讀/寫操作都具有原子性。

這3個差異與處理器總線的工作機制密切相關。
總線事務包括讀事務和寫事物。讀事務從內存傳遞數據到處理器,寫事務從處理器傳送數據到內存。每個事物會讀/寫內存中一個或多個物理上連續的字。在一個處理器執行總線事物期間,總線會禁止其他的處理器和I/O設備執行內存的讀/寫。
這裏寫圖片描述

假設處理器A,B,C同時向總線發起總線事務,只是總線仲裁會對競爭做出裁決,這裏假設總線在仲裁後判定處理器A在競爭中獲勝。此時處理器A繼續它的總線事物,而其他兩個處理器則要等待處理器A的總線事務完成後才能再次執行內存訪問。期間不管總線事物是讀事務還是寫事物。
總線的這些工作機制可以把所有處理器對內存的訪問以串型化的方式來執行。在任意時間點,最多隻能有一個處理器可以訪問內存。這個特性確保了單個總線之中的內存讀/寫操作的原子性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章