本篇文章給大家分享的是有關(guān)Java內(nèi)存模型的指令重排是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)建站 - 光華機(jī)房服務(wù)器托管,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽服務(wù)器托管,德陽服務(wù)器托管,遂寧服務(wù)器托管,綿陽服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),光華機(jī)房服務(wù)器托管,西南服務(wù)器托管,四川/成都大帶寬,大帶寬服務(wù)器,四川老牌IDC服務(wù)商JMM是內(nèi)存模型規(guī)范在Java語言中的體現(xiàn)。JMM保證了在多核CPU多線程編程環(huán)境下,對共享變量讀寫的原子性、可見性和有序性。
指令重排
在說有序性之前,我們必須先來聊下指令重排,因?yàn)槿绻麤]有指令重拍的話,也就不存在有序性問題了。
指令重排是指編譯器和處理器在不影響代碼單線程執(zhí)行結(jié)果的前提下,對源代碼的指令進(jìn)行重新排序執(zhí)行。這種重排序執(zhí)行是一種優(yōu)化手段,目的是為了處理器內(nèi)部的運(yùn)算單元能盡量被充分利用,提升程序的整體運(yùn)行效率。
編譯器優(yōu)化的重排序。
編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執(zhí)行順序。
指令級并行的重排序。
現(xiàn)代處理器采用了指令級并行技術(shù)來將多條指令重疊執(zhí)行。如果不存在數(shù)據(jù)依賴性,處理器可以改變語句對應(yīng)機(jī)器指令的執(zhí)行順序。
內(nèi)存系統(tǒng)的重排序。
由于處理器使用緩存和讀/寫緩沖區(qū),這使得加載和存儲操作看上去可能是在亂序執(zhí)行。
通過指令重排的定義可以看出:指令重拍只能保證單線程執(zhí)行下的正確性,在多線程環(huán)境下,指令重排會帶來一定的問題(一個硬幣具有兩面性,指令重排帶來性能提升的同時也增加了編程的復(fù)雜性)。下面我們就來展示一個列子,看看指令重排是怎么影響程序執(zhí)行結(jié)果的。
對于上面的代碼,假如我們開啟一個線程調(diào)用startSystem,再開啟一個線程不斷調(diào)用checkStartes方法,我們并不能保證代碼執(zhí)行到“關(guān)注點(diǎn)”處,var變量的值一定是3。因?yàn)樵趕tartSystem方法中的兩個賦值語句并不存在依賴關(guān)系,所以在編譯器進(jìn)行代碼編譯時可能進(jìn)行指令重排。
也就是先執(zhí)行started=true;執(zhí)行完這個語句后,線程立馬執(zhí)行checkStartes方法,此時value值還是1,那么最后在關(guān)注點(diǎn)處的var值就是2,而不是我們想象中的3。
以上就是Java內(nèi)存模型的指令重排是什么,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:Java內(nèi)存模型的指令重排是什么-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://www.rwnh.cn/article18/dpeidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、虛擬主機(jī)、網(wǎng)站內(nèi)鏈、動態(tài)網(wǎng)站、App開發(fā)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容