欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

JVM的重排序 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

JVM的重排序

發(fā)表時間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):31


重排序平日是編譯器或運行時情況為了優(yōu)化法度榜樣機能而采取的對指令進行從新排序履行的一種手段。重排序分為兩類:編譯期重排序和運行期重排序,分別對應編譯時和運行時情況。
在并發(fā)法度榜樣中,法度榜樣員會特別存眷不合過程或線程之間的數(shù)據(jù)同步,特別是多個線程同時修改同一變量時,必須采取靠得住的同步或其它辦法保障數(shù)據(jù)被精確地修改,這里的一條重要原則是:不要假設指令履行的次序,你無法預知不合線程之間的指令會以何種次序履行。
然則在單線程法度榜樣中,平日我們輕易假設指令是次序履行的,不然可以想象法度榜樣會產(chǎn)生什么恐怖的變更?;孟氲哪P褪牵簭褪庲噶盥男械拇涡蚴仟氁磺矣行虻?,這個次序就是它們被編寫在代碼中的次序,與處理器或其它身分無關,這種模型被稱作次序一致性模型,也是基于馮·諾依曼體系的模型。當然,這種假設本身是合理的,在實踐中也鮮有異常產(chǎn)生,但事實上,沒有哪個現(xiàn)代多處理器架構會采取這種模型,因為它是在是太低效了。而在編譯優(yōu)化和CPU流水線中,幾乎都涉及到指令重排序。

編譯期重排序


編譯期重排序的典范就是經(jīng)由過程調(diào)劑指令次序,在不改變法度榜樣語義的前提下,盡可能削減存放器的攫取、存儲次數(shù),充分復竽暌姑存放器的存儲值。
假設第一條指令計算一個值賦給變量A并存放在存放器中,第二條指令與A無關但須要占用存放器(假設它將占用A地點的那個存放器),第三條指令應用A的值且與第二條指令無關。那么如不雅按照次序一致性模型,A在第一條指令履行過后被放入存放器,在第二條指令履行時A不再存在,第三條指令履行時A從新被讀入存放器,而這個過程中,A的值沒有產(chǎn)生變更。平日編譯器都邑交換第二和第三條指令的地位,如許第一條指令停止時A存在于存放器中,接下來可以直接大年夜存放器中攫取A的值,降低了反復攫取的開銷。

重排序?qū)τ诹魉€的意義


現(xiàn)代CPU幾乎都采取流水線機制加快指令的處理速度,一般來說,一條指令須要若干個CPU時鐘周期處理,而經(jīng)由過程流水線并行履行,可以在一致的時鐘周期內(nèi)履行若干條指令,具體做法簡單地說就是把指令分為不合的履行周期,例如攫取、尋址、解析、履行等步調(diào),并放在不合的元件中處理,同時在履行單位EU中,功能單位被分為不合的元件,例如加法元件、乘法元件、加載元件、存儲元件等,可以進一步實現(xiàn)不合的計算并行履行。
流水線架構決定了指令應當被并行履行,而不是在次序化模型中所認為的那樣。重排序有利于充分應用流水線,進而達到超標量的效不雅。

確保次序性


盡管指令在履行時并不必定按照我們所編寫的次序履行,但毋庸置疑的是,在單線程情況下,指令履行的最終效不雅應當與其在次序履行下的效不雅一致,不然這種優(yōu)化便會掉去意義。
平日無論是在編譯期照樣運行期進行的指令重排序,都邑知足膳綾擎的原則。

Java存儲模型中的重排序


在Java存儲模型(Java Memory Model, JMM)中,重排序是十分重要的一節(jié),特別是在并發(fā)編程中。JMM經(jīng)由過程happens-before軌則包管次序履行語義,如不雅想要讓履行操作B的線程不雅察到履行操作A的線程的結不雅,那么A和B就必須知足happens-before原則,不然,JVM可以對它們進行隨便率性排序以進步法度榜樣機能。
volatile關鍵字可以包管變量的可見性,因為對volatile的操作都在Main Memory中,而Main Memory是被所有線程所共享的,這里的價值就是就義了機能,無法應用存放器或Cache,因為它們都不是全局的,無法包管可見性,可能產(chǎn)生臟讀。
volatile還有一個感化就是局部阻攔重排序的產(chǎn)生,對volatile變量的操作指令都不會被重排序,因為如不雅重排序,又可能產(chǎn)生可見性問題。
在包管可見性方面,鎖(包含顯式鎖、對象鎖)以及對原子變量的讀寫都可以確保變量的可見性。然則實現(xiàn)方法略有不合,例如同步鎖包管獲得鎖時大年夜內(nèi)存里從新讀入數(shù)據(jù)刷新緩存,釋放鎖時將數(shù)據(jù)寫回內(nèi)存以保數(shù)據(jù)可見,而volatile變量干脆都是讀寫內(nèi)存。

相關案例查看更多