順序一致性模型是一個(gè)理論參考模型喊括。
1. 數(shù)據(jù)競(jìng)爭(zhēng)與順序一致性
當(dāng)數(shù)據(jù)未正確同步時(shí),可能會(huì)出現(xiàn)數(shù)據(jù)競(jìng)爭(zhēng)窃页。JAVA內(nèi)存模型規(guī)范對(duì)數(shù)據(jù)競(jìng)爭(zhēng)的定義如下:
? ? ? ? 在一個(gè)線程中寫一個(gè)變量?
? ? ? ? 在另一個(gè)線程中讀同一個(gè)變量
? ? ? ? 而且寫和讀沒有通過(guò)同步來(lái)排序
2.兩大特性
1)一個(gè)線程中所有操作必須按照程序的順序來(lái)執(zhí)行伦籍;
2)(不管程序是否同步)所有線程都只能看到單一的操作執(zhí)行順序。在順序一致性模型中腮出,每個(gè)操作都必須原子執(zhí)行且立即對(duì)所有線程可見帖鸦。
注意:在順序一致性模型中,可能整體執(zhí)行順序是無(wú)序的胚嘲,但對(duì)于單個(gè)線程而言執(zhí)行是順序的作儿。
在JMM中沒有順序一致性的保證,未同步程序在JMM中不但整體的執(zhí)行順序是無(wú)序的馋劈,而且所有線程看到的操作執(zhí)行順序也可能不一致攻锰。
-->使用同步原語(yǔ)(volatile、synchronized妓雾、final)進(jìn)行同步娶吞。
臨界區(qū)內(nèi)的代碼會(huì)做重排序。但由于監(jiān)視器互斥執(zhí)行的特性械姻,線程間無(wú)法看到彼此內(nèi)部的重排序妒蛇,因此這種重排序既提高了執(zhí)行效率,又沒有改變程序的執(zhí)行結(jié)果楷拳。
比較:(重排序與順序一致性模型)
1. 順序一致性模型保證單線程內(nèi)的操作會(huì)按照程序的順序執(zhí)行绣夺,而JMM不保證單線程內(nèi)的操作會(huì)按照程序的順序執(zhí)行
2. 順序一致性模型保證所有線程只能看到一致的操作執(zhí)行順序,而JMM不保證能看到一致的操作順序
3. JMM不保證對(duì)64位的long型和double型變量的寫操作具有原子性欢揖,而順序一致性模型保證對(duì)所有的內(nèi)存讀寫具有原子性陶耍。
其中,第三個(gè)差異與處理機(jī)總線的工作機(jī)制密切相關(guān)她混。數(shù)據(jù)通過(guò)總線在處理機(jī)和內(nèi)存之間傳遞烈钞。這些步驟稱為總線事務(wù)泊碑,包括讀事務(wù)和寫事務(wù)√盒溃總線會(huì)試圖并發(fā)使用總線的事務(wù)蛾狗,在一個(gè)處理機(jī)執(zhí)行總線事務(wù)期間,總線會(huì)禁止其他處理器和I/O設(shè)備執(zhí)行內(nèi)存數(shù)據(jù)的讀寫仪媒。
總線的工作機(jī)制把所有處理機(jī)對(duì)內(nèi)存的訪問(wèn)以串行的方式來(lái)執(zhí)行沉桌,確保了總線事務(wù)中的內(nèi)存讀寫操作具有原子性。在32位機(jī)上對(duì)64位的數(shù)據(jù)進(jìn)行寫操作時(shí)算吩,會(huì)拆分成兩個(gè)32位的寫操作留凭,因此可能 會(huì)分配到不同的總線事務(wù)執(zhí)行,不再具有原子性偎巢。