如果兩個操作同時訪問同一個變量,且存在寫操作,那么這兩個操作就存在數(shù)據(jù)依賴性。
數(shù)據(jù)依賴性分為三種:
上面三種情況如果操作重排序,就有可能會改變執(zhí)行結(jié)果。所以編譯器和處理器在重排序的時候不會對存在數(shù)據(jù)依賴性的操作進行重排序。
注:數(shù)據(jù)依賴性僅針對單個處理器中執(zhí)行的指令序列和單個線程中執(zhí)行的操作。
解釋:不管怎么重排序,(單線程)程序的執(zhí)行結(jié)果不能改變。編譯器處理器runtime都必須遵守as-if-serial語義。
3、程序順序規(guī)則遵守happens-before規(guī)則。
JMM僅僅要求前一個操作(執(zhí)行的結(jié)果)對后一個操作可見,且前一個操作按順序排在第二個操作之前。
重排序會影響多線程的程序執(zhí)行結(jié)果。
class ReorderExample {int a = 0;
boolean flag = false;
public void writer() {a = 1; // 1
flag = true; // 2
}
Public void reader() {if (flag) {// 3
int i = a * a; // 4
……
}
}
}
當有兩個線程A和B順序操作writer()和reader()方法時,執(zhí)行操作4時不一定能看到操作1對共享變量a的寫入。因為操作1和操作2不存在數(shù)據(jù)依賴性,操作3和操作4也不存在數(shù)據(jù)依賴性,可以對他們重排序。
操作3和操作4存在控制依賴性,會影響指令序列的并行度。為此,編譯器和處理器會采用猜測(Speculation)執(zhí)行來克服控制相關(guān)性對并行度的影響。
以處理器的猜測執(zhí)行為例,執(zhí)行線程B的處理器可以提前讀取并計算a*a,然后把計算結(jié)果臨時保存到一個名為重排序緩沖(ReorderBuffer,ROB)的硬件緩存中。當操作3的條件判斷為真時,就把該計算結(jié)果寫入變量i中。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
文章名稱:讀書筆記-JMM-重排序-創(chuàng)新互聯(lián)
當前路徑:http://sd-ha.com/article0/decsoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、動態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站改版、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)