順序一致性模型是一個理論參考模型。
1. 數據競爭與順序一致性
當數據未正確同步時,可能會出現數據競爭。JAVA內存模型規范對數據競爭的定義如下:
? ? ? ? 在一個線程中寫一個變量?
? ? ? ? 在另一個線程中讀同一個變量
? ? ? ? 而且寫和讀沒有通過同步來排序
2.兩大特性
1)一個線程中所有操作必須按照程序的順序來執行;
2)(不管程序是否同步)所有線程都只能看到單一的操作執行順序。在順序一致性模型中,每個操作都必須原子執行且立即對所有線程可見。
注意:在順序一致性模型中,可能整體執行順序是無序的,但對于單個線程而言執行是順序的。
在JMM中沒有順序一致性的保證,未同步程序在JMM中不但整體的執行順序是無序的,而且所有線程看到的操作執行順序也可能不一致。
-->使用同步原語(volatile、synchronized、final)進行同步。
臨界區內的代碼會做重排序。但由于監視器互斥執行的特性,線程間無法看到彼此內部的重排序,因此這種重排序既提高了執行效率,又沒有改變程序的執行結果。
比較:(重排序與順序一致性模型)
1. 順序一致性模型保證單線程內的操作會按照程序的順序執行,而JMM不保證單線程內的操作會按照程序的順序執行
2. 順序一致性模型保證所有線程只能看到一致的操作執行順序,而JMM不保證能看到一致的操作順序
3. JMM不保證對64位的long型和double型變量的寫操作具有原子性,而順序一致性模型保證對所有的內存讀寫具有原子性。
其中,第三個差異與處理機總線的工作機制密切相關。數據通過總線在處理機和內存之間傳遞。這些步驟稱為總線事務,包括讀事務和寫事務。總線會試圖并發使用總線的事務,在一個處理機執行總線事務期間,總線會禁止其他處理器和I/O設備執行內存數據的讀寫。
總線的工作機制把所有處理機對內存的訪問以串行的方式來執行,確保了總線事務中的內存讀寫操作具有原子性。在32位機上對64位的數據進行寫操作時,會拆分成兩個32位的寫操作,因此可能 會分配到不同的總線事務執行,不再具有原子性。