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