Java內(nèi)存模型的指令重排是什么

本篇文章給大家分享的是有關Java內(nèi)存模型的指令重排是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

站在用戶的角度思考問題,與客戶深入溝通,找到江城網(wǎng)站設計與江城網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網(wǎng)站制作、網(wǎng)站設計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋江城地區(qū)。

JMM是內(nèi)存模型規(guī)范在Java語言中的體現(xiàn)。JMM保證了在多核CPU多線程編程環(huán)境下,對共享變量讀寫的原子性、可見性和有序性。

指令重排

在說有序性之前,我們必須先來聊下指令重排,因為如果沒有指令重拍的話,也就不存在有序性問題了。

指令重排是指編譯器和處理器在不影響代碼單線程執(zhí)行結果的前提下,對源代碼的指令進行重新排序執(zhí)行。這種重排序執(zhí)行是一種優(yōu)化手段,目的是為了處理器內(nèi)部的運算單元能盡量被充分利用,提升程序的整體運行效率。

重排序分為以下幾種:

編譯器優(yōu)化的重排序。

編譯器在不改變單線程程序語義的前提下,可以重新安排語句的執(zhí)行順序。

指令級并行的重排序。

現(xiàn)代處理器采用了指令級并行技術來將多條指令重疊執(zhí)行。如果不存在數(shù)據(jù)依賴性,處理器可以改變語句對應機器指令的執(zhí)行順序。

內(nèi)存系統(tǒng)的重排序。

由于處理器使用緩存和讀/寫緩沖區(qū),這使得加載和存儲操作看上去可能是在亂序執(zhí)行。

通過指令重排的定義可以看出:指令重拍只能保證單線程執(zhí)行下的正確性,在多線程環(huán)境下,指令重排會帶來一定的問題(一個硬幣具有兩面性,指令重排帶來性能提升的同時也增加了編程的復雜性)。下面我們就來展示一個列子,看看指令重排是怎么影響程序執(zhí)行結果的。

對于上面的代碼,假如我們開啟一個線程調(diào)用startSystem,再開啟一個線程不斷調(diào)用checkStartes方法,我們并不能保證代碼執(zhí)行到“關注點”處,var變量的值一定是3。因為在startSystem方法中的兩個賦值語句并不存在依賴關系,所以在編譯器進行代碼編譯時可能進行指令重排。

也就是先執(zhí)行started=true;執(zhí)行完這個語句后,線程立馬執(zhí)行checkStartes方法,此時value值還是1,那么最后在關注點處的var值就是2,而不是我們想象中的3。

以上就是Java內(nèi)存模型的指令重排是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前題目:Java內(nèi)存模型的指令重排是什么
文章路徑:http://bm7419.com/article12/gegggc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站建設、小程序開發(fā)、網(wǎng)站維護動態(tài)網(wǎng)站、關鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)