JAVA內存模型--順序一致性

順序一致性模型是一個理論參考模型。

1. 數據競爭與順序一致性

當數據未正確同步時,可能會出現數據競爭。JAVA內存模型規范對數據競爭的定義如下:

? ? ? ? 在一個線程中寫一個變量?

? ? ? ? 在另一個線程中讀同一個變量

? ? ? ? 而且寫和讀沒有通過同步來排序

2.兩大特性

1)一個線程中所有操作必須按照程序的順序來執行;

2)(不管程序是否同步)所有線程都只能看到單一的操作執行順序。在順序一致性模型中,每個操作都必須原子執行且立即對所有線程可見。

注意:在順序一致性模型中,可能整體執行順序是無序的,但對于單個線程而言執行是順序的。


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

-->使用同步原語(volatile、synchronized、final)進行同步。

臨界區內的代碼會做重排序。但由于監視器互斥執行的特性,線程間無法看到彼此內部的重排序,因此這種重排序既提高了執行效率,又沒有改變程序的執行結果。

比較:(重排序與順序一致性模型)

1. 順序一致性模型保證單線程內的操作會按照程序的順序執行,而JMM不保證單線程內的操作會按照程序的順序執行

2. 順序一致性模型保證所有線程只能看到一致的操作執行順序,而JMM不保證能看到一致的操作順序

3. JMM不保證對64位的long型和double型變量的寫操作具有原子性,而順序一致性模型保證對所有的內存讀寫具有原子性。

其中,第三個差異與處理機總線的工作機制密切相關。數據通過總線在處理機和內存之間傳遞。這些步驟稱為總線事務,包括讀事務和寫事務。總線會試圖并發使用總線的事務,在一個處理機執行總線事務期間,總線會禁止其他處理器和I/O設備執行內存數據的讀寫。

總線的工作機制把所有處理機對內存的訪問以串行的方式來執行,確保了總線事務中的內存讀寫操作具有原子性。在32位機上對64位的數據進行寫操作時,會拆分成兩個32位的寫操作,因此可能 會分配到不同的總線事務執行,不再具有原子性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容