日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

三道java新手入門面試題,通往自由的道路--JVM

瀏覽:29日期:2022-08-10 16:26:40
目錄1. 你知道JVM內存模型嗎?2. 你知道重排序是什么嗎?3. happens-before是什么,和as-if-serial有什么區別總結1. 你知道JVM內存模型嗎?

在Java的并發中采用的就是JVM內存共享模型即JMM(Java Memory Model),它其實是是JVM規范中所定義的一種內存模型,跟計算機的CPU緩存內存模型類似,是基于CPU緩存內存模型來建立的,Java內存模型是標準化的,屏蔽掉了底層不同計算機的區別。

那我們先來講下計算機的內存模型:

其實早期計算機中CPU和內存的速度是差不多的,但在現代計算機中,CPU的指令速度遠超內存的存取速度,由于計算機的存儲設備與處理器的運算速度有幾個數量級的差距,所以現代計算機系統都不得不加入一層讀寫速度盡可能接近處理器運算速度的高速緩存(Cache)來作為內存與處理器之間的緩沖。

將運算需要使用到的數據復制到緩存中,讓運算能快速進行,當運算結束后再從緩存同步回內存之中,這樣處理器就無須等待緩慢的內存讀寫了。

基于高速緩存的存儲交互很好地解決了處理器與內存的速度矛盾,但是也為計算機系統帶來更高的復雜度,因為它引入了一個新的問題:緩存一致性(CacheCoherence)。

在多處理器系統中,每個處理器都有自己的高速緩存,而它們又共享同一主內存(MainMemory)。

三道java新手入門面試題,通往自由的道路--JVM

而我們可以打開任務管理器,可以進入性能 --> CPU中可以看到L1緩存、L2緩存和L3緩存。

三道java新手入門面試題,通往自由的道路--JVM

可以看到我們CPU跟我們計算機之間交互的高速緩存。一般的流程,就是計算機會先從硬盤從讀取數據到主內存中,又會從主內存讀取數據到高速緩存中,而CPU讀取的數據就是高速緩存中的數。

我們現在再來看看JMM:

JMM是定義了線程和主內存之間的抽象關系:線程之間的共享變量存在主內存(MainMemory)中,每個線程都有一個私有的本地內存(LocalMemory)即共享變量副本,本地內存中存儲了該線程以讀、寫共享變量的副本。本地內存是Java內存模型的一個抽象概念,并不真實存在。它涵蓋了緩存、寫緩沖區、寄存器等。

JMM模型圖:

三道java新手入門面試題,通往自由的道路--JVM

我們可以發現在JMM模型中:

所有的共享變量都存在主內存中。 每個線程都保存了一份該線程使用到的共享變量的副本。 線程A是無法直接訪問到線程B的本地內存的,只能訪問主內存。線 程對共享變量的所有操作都必須在自己的本地內存中進行,不能直接從主內存中讀取。 并發的三要素:可見性、原子性、有序性,而JMM就主要體現在這三方面。

注意 :因為線程之間無法相互訪問,而一旦某個線程將共享變量進行修改,而線程B是無法發現到這個更新值的,所以可能會出現可見性問題。而這里的可見性問題就是一個線程對共享變量的修改,另一個線程能夠立刻看到,但此時無法看到更新后的內存,因為訪問的是自己的共享變量副本。

解決方案有

加鎖,加synchronized、Lock,保存一個線程只能等另一個線程結束后才能再訪問變量。 對共享變量加上volatile關鍵字,保證了這個變量是可見的。2. 你知道重排序是什么嗎?

重排序是指計算機在執行程序時,為了提高性能,編譯器和處理器常常會對指令做重排。

首先我們來看看為什么指令重排序可以提高性能?

每一個指令都會包含多個步驟,每個步驟可能使用不同的硬件,而現代處理器會設計為一個時鐘周期完成一條執行時間最長的指令,為什么會這樣呢?

主要原理就是可以指令1還沒有執行完,就可以開始執行指令2,而不用等到指令1執行結束之后再執行指令2,這樣就大大提高了效率。

例如:每條指令拆分為五個階段:

三道java新手入門面試題,通往自由的道路--JVM

想這樣如果是按順序串行執行指令,那可能相對比較慢,因為需要等待上一條指令完成后,才能等待下一步執行:

三道java新手入門面試題,通往自由的道路--JVM

而如果發生指令重排序呢,實際上雖然不能縮短單條指令的執行時間,但是它變相地提高了指令的吞吐量,可以在一個時鐘周期內同時運行五條指令的不同階段。

三道java新手入門面試題,通往自由的道路--JVM

我們來分析下代碼的執行情況,并思考下:

a = b + c;

d = e - f ;

按原先的思路,會先加載b和c,再進行b+c操作賦值給a,接下來就會加載e和f,最后就是進行e-f操作賦值給d。

這里有什么優化的空間呢?我們在執行b+c操作賦值給a時,可能需要等待b和c加載結束,才能再進行一個求和操作,所以這里可能出現了一個停頓等待時間,依次后面的代碼也可能會出現停頓等待時間,這降低了計算機的執行效率。

為了去減少這個停頓等待時間,我們可以先加載e和f,然后再去b+c操作賦值給a,這樣做對程序(串行)是沒有影響的,但卻減少了停頓等待時間。既然b+c操作賦值給a需要停頓等待時間,那還不如去做一些有意義的事情。

總結:指令重排對于提高CPU處理性能十分必要。雖然由此帶來了亂序的問題,但是這點犧牲是值得的。

重排序的類型有以下幾種:

三道java新手入門面試題,通往自由的道路--JVM

指令重排一般分為以下三種:

編譯器優化重排

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

指令并行重排

現代處理器采用了指令級并行技術來將多條指令重疊執行。如果不存在數據依賴性(即后一個執行的語句無需依賴前面執行的語句的結果),處理器可以改變語句對應的機器指令的執行順序。

內存系統重排

由于處理器使用緩存和讀寫緩存沖區,這使得加載(load)和存儲(store)操作看上去可能是在亂序執行,因為三級緩存的存在,導致內存與緩存的數據同步存在時間差。

而在重排序中還需要一個概念的東西:as-if-serial

不管如何重排序,都必須保證代碼在單線程下的運行正確,連單線程下都無法正確,更不用討論多線程并發的情況,所以就提出了一個as-if-serial的概念。

as-if-serial語義的意思是:

不管怎么重排序,程序的執行結果不能被改變。編譯器、runtime和處理器都必須遵守as-if-serial語義。 為了遵守as-if-serial語義,編譯器和處理器不會對存在數據依賴關系的操作做重排序,因為這種重排序會改變執行結果。(強調一下,這里所說的數據依賴性僅針對單個處理器中執行的指令序列和單個線程中執行的操作,不同處理器之間和不同線程之間的數據依賴性不被編譯器和處理器考慮)。但是,如果操作之間不存在數據依賴關系,這些操作依然可能被編譯器和處理器重排序。3. happens-before是什么,和as-if-serial有什么區別

happens-before的概念:

一方面,程序員需要JMM提供一個強的內存模型來編寫代碼;另一方面,編譯器和處理器希望JMM對它們的束縛越少越好,這樣它們就可以最可能多的做優化來提高性能,希望的是一個弱的內存模型。

JMM考慮了這兩種需求,并且找到了平衡點,對編譯器和處理器來說,只要不改變程序的執行結果(單線程程序和正確同步了的多線程程序),編譯器和處理器怎么優化都行。

而對于程序員,JMM提供了happens-before規則(JSR-133規范),在JMM中,如果一個線程執行的結果需要對另一個操作進行可見,那么這兩個操作直接必須存在happens-before關系。

JMM使用happens-before的概念來定制兩個操作之間的執行順序。這并不意味著前一個操作必須要在后一個操作之前執行!happens-before僅僅要求前一個操作(執行的結果)對后一個操作可見,且前一個操作按順序排在第二個操作之前 。

happens-before關系的定義如下:

如果一個操作happens-before另一個操作,那么第一個操作的執行結果將對第二個操作可見,而且第一個操作的執行順序排在第二個操作之前。 兩個操作之間存在happens-before關系,并不意味著Java平臺的具體實現必須要按照happens-before關系指定的順序來執行。如果重排序之后的執行結果,與按happens-before關系來執行的結果一致,那么JMM也允許這樣的重排序。 happens-before關系保證正確同步的多線程程序的執行結果不被重排序改變。

在Java中,有以下天然的Happens-Before規則:

程序順序規則:一個線程中的每一個操作,happens-before于該線程中的任意后續操作。 監視器鎖規則:對一個鎖的解鎖,happens-before于隨后對這個鎖的加鎖。 volatile變量規則:對一個volatile域的寫,happens-before于任意后續對這個volatile域的讀。 傳遞性:如果A happens-before B,且B happens-before C,那么A happens-before C。 start規則:如果線程A執行操作ThreadB.start()啟動線程B,那么A線程的ThreadB.start()操作happens-before于線程B中的任意操作、 join規則:如果線程A執行操作ThreadB.join()并成功返回,那么線程B中的任意操作happens-before于線程A從ThreadB.join()操作成功返回。 線程中斷規則:對線程interrupt()方法的調用happens-before于被中斷線程的代碼檢測到中斷事件的發生。

Happens-Before和as-if-serial的關系實質上是一回事。

as-if-serial語義保證單線程內重排序后的執行結果和程序代碼本身應有的結果是一致的,happens-before關系保證正確同步的多線程程序的執行結果不被重排序改變。 as-if-serial語義和happens-before這么做的目的,都是為了在不改變程序執行結果的前提下,盡可能地提高程序執行的并行度。總結

這篇文章就到這里了,如果這篇文章對你也有所幫助,希望您能多多關注好吧啦網的更多內容!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩欧美午夜| 日韩视频不卡| 日韩欧美高清一区二区三区| 久久午夜精品| 丝袜美腿成人在线| 蜜臀精品一区二区三区在线观看| 性色av一区二区怡红| 免费在线观看精品| 亚洲精品激情| 国产精品黄色| 精品亚洲二区| 成人日韩在线| 国产一级久久| 日韩三区四区| 国产日韩高清一区二区三区在线 | 在线午夜精品| 天使萌一区二区三区免费观看| 男女性色大片免费观看一区二区| 久久国产精品毛片| 亚洲精品乱码日韩| 国产精品宾馆| 精品久久久亚洲| 天堂中文在线播放| 欧美丝袜一区| 日本亚洲三级在线| 久久精品天堂| 欧美成人日韩| 日韩区欧美区| 高清日韩欧美| 国产精品美女| 国产精品亚洲二区| 人人香蕉久久| 一区二区精品| 激情久久一区二区| 欧美香蕉视频| 蜜臀av一区二区在线免费观看| 欧美日韩a区| 成人在线免费观看网站| 极品日韩av| 欧美亚洲免费| 91免费精品| 亚洲深爱激情| 国产伦精品一区二区三区在线播放| 成人免费一区| 红桃视频国产一区| 国产毛片精品久久| 一区二区三区视频免费观看| 亚洲永久精品唐人导航网址| 欧美国产日本| 9色精品在线| 欧美日韩91| 99tv成人| 亚洲精品人人| 91嫩草亚洲精品| 免费成人在线视频观看| 免费亚洲婷婷| 久久成人国产| 欧美久久天堂| 日本vs亚洲vs韩国一区三区二区| 国产一区二区三区国产精品| 视频精品一区二区| 福利视频一区| 综合色一区二区| 成人羞羞在线观看网站| 日韩高清在线观看一区二区| 精品成人免费一区二区在线播放| 亚洲精品美女91| 成人影视亚洲图片在线| 香蕉久久夜色精品国产| 国产一区二区三区黄网站| 视频一区二区不卡| 中文字幕一区久| 奇米亚洲欧美| 在线 亚洲欧美在线综合一区| 欧美激情99| 偷拍亚洲精品| 亚洲精品一区二区妖精| 韩国女主播一区二区三区| 日本在线视频一区二区| 亚洲精品在线观看91| 国产一区三区在线播放| 日韩综合一区二区| 亚洲成人国产| 欧美激情五月| 日本h片久久| 蜜臀久久99精品久久久久久9| 99久精品视频在线观看视频| 老司机精品在线| 亚洲精品九九| 鲁大师影院一区二区三区| 久久久久国产精品一区三寸| 精品视频99| 国产毛片精品| 日韩激情精品| 亚洲三级网址| 亚洲免费影视| 美女网站一区| 日韩啪啪电影网| 精品三级av在线导航| 国产日产高清欧美一区二区三区| 久久亚洲电影| 国产视频亚洲| 欧美午夜不卡| 伊人久久婷婷| 欧美日韩国产探花| 五月天综合网站| 国产精品91一区二区三区| 久久久久99| 电影亚洲精品噜噜在线观看| 色一区二区三区四区| 精品一区二区三区在线观看视频| 国产精品亚洲二区| 91精品国产自产观看在线| 老牛影视一区二区三区| 国产日韩综合| 日韩中文字幕区一区有砖一区| 国产一级久久| 欧美中文日韩| 亚洲精品免费观看| 青青国产精品| 欧美日韩亚洲一区三区| 亚洲精品无播放器在线播放| 香蕉久久久久久| 91精品一区| 国产精品一页| 久久精品女人| 天堂√8在线中文| 日韩伦理在线一区| 91嫩草亚洲精品| 亚洲va中文在线播放免费| 91精品国产自产在线观看永久∴| 久久精品不卡| 国产精品外国| 日韩av中文字幕一区二区三区| 日本欧美一区| 久久99蜜桃| 国产精品久久久久蜜臀| 性感美女一区二区在线观看| 午夜欧美理论片| 日韩欧美三区| 久久av电影| 国产精品久久久久av电视剧| 婷婷亚洲五月| 三级欧美在线一区| 91九色综合| 成人午夜毛片| 国内亚洲精品| 在线国产精品一区| 国产精品一区二区99| 97精品国产| 激情综合在线| 婷婷综合福利| 荡女精品导航| 婷婷综合网站| 日本在线一区二区三区| 久久av影视| 久久精品国产68国产精品亚洲| 久久香蕉精品| 久久精品99国产精品| 91亚洲人成网污www| 亚洲精品在线观看91| 婷婷精品在线| 97精品国产一区二区三区| 日韩午夜精品| 久久精品99久久久| 日韩精品一区二区三区免费观影| 免费视频最近日韩| 国产日产精品_国产精品毛片| 激情黄产视频在线免费观看| 亚洲欧美日韩高清在线| 日韩国产在线一| 超级白嫩亚洲国产第一| 国产精品婷婷| 国产毛片久久久| 久久亚洲专区| 欧美日韩亚洲一区三区| 日韩电影二区| 日本在线一区二区三区| 91精品韩国| 91精品国产一区二区在线观看 | 鲁鲁在线中文| 蜜桃视频一区二区| 精品国产精品久久一区免费式 | 青草久久视频| 99视频精品全部免费在线视频| 一区二区电影| 麻豆成全视频免费观看在线看| 免费在线观看一区二区三区| 成人精品国产亚洲| 亚洲图片久久| 偷拍精品精品一区二区三区| 日本a级不卡| 午夜国产精品视频| 电影91久久久| 日韩va亚洲va欧美va久久| 亚洲香蕉网站| 久久精品网址| 日韩精品视频在线看| 亚洲黑丝一区二区| 欧美国产亚洲精品|