溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2021-10-14 16:32:43 來源:億速云 閱讀:113 作者:柒染 欄目:編程語言

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

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

  指令重排

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

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

重排序分為以下幾種:

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

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

  指令級并行的重排序。

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

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

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

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

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

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

以上就是Java內(nèi)存模型的指令重排是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI