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