真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

Java中內存模型JMM的示例分析

小編給大家分享一下Java中內存模型JMM的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

成都創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網站建設公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務,在本地打下了良好的口碑,在過去的十多年時間我們累計服務了上千家以及全國政企客戶,如成都宴會酒店設計等企業(yè)單位,完善的項目管理流程,嚴格把控項目進度與質量監(jiān)控加上過硬的技術實力獲得客戶的一致表揚。

有時候編譯器、處理器的優(yōu)化會導致runtime與我們設想的不一樣,為此Java對編譯器和處理器做了一些限制,JAVA內存模型(JMM)將這些抽象出來,這樣編寫代碼時就無需考慮那么多底層細節(jié),并保證“只要遵循JMM的規(guī)則編寫程序,其運行結果一定是正確的”。

JMM的抽象結構

在Java中,所有的實例、靜態(tài)變量存儲在堆內存中,堆內存是可以在線程間共享的,這部分也稱為共享變量。而局部變量、方法定義參數、異常處理參數是在棧中的,棧內存不在線程間共享。

而由于編譯器、處理器的優(yōu)化,會導致共享變量出現可見性問題,像在多核處理器中(multi-processor),線程可以在不同的處理器上執(zhí)行,而處理器之間緩存不一致,會使共享變量出現可見性問題,有可能兩個線程看到同一個變量不同值。

JMM將這些硬件做的優(yōu)化抽象成每個線程都有一個本地內存。需要讀寫共享變量時,從主內存中拷貝一份到本地內存。當寫共享變量時,先寫到本地內存中去,在將來某個時間再刷新到主內存中。當再次讀共享變量時,則只會從本地內存中讀取。

這樣線程間通訊就需要經過兩步:

寫線程:刷新本地內存到主內存中去讀線程:從主內存讀取更新后的值

這樣在寫-讀之間就有一個延遲:本地內存什么時候刷新到主內存中去?導致可見性問題,不同線程可能看到的共享變量不一樣。

Java中內存模型JMM的示例分析

happens-before

從字面上看happens-before的意思是“發(fā)生在此之前”。這是java對程序執(zhí)行順序制定的規(guī)則,實現同步必須遵循該規(guī)則。這樣程序員只需要寫出正確的同步程序,happens-before保證運行結果不會錯。

A happens-before B,不僅僅表示A在B之前執(zhí)行,還意味著A的執(zhí)行結果對B可見,這保證了可見性。

A happens-before B,A也不一定要在B之前執(zhí)行,如果AB交替,執(zhí)行結果任然正確,則允許編譯器、處理器進行優(yōu)化重排序。所以只要程序結果正確,編譯器、處理器怎么優(yōu)化,怎么重排序都沒問題,都是好的。

happens-before規(guī)則

程序順序規(guī)則:在一個線程中,前面的操作happens-before后面的操作鎖規(guī)則:對同一個鎖,解鎖happens-before加鎖 volatile域規(guī)則:寫volatile變量,happens-before后面任意一個讀這個volatile變量的操作傳遞性:A happens-before B,B happens-before C,則A happens-before C start()規(guī)則:如果線程A執(zhí)行ThreadB.start() 那么ThreadB.start() happens-before 線程B中任何操作 join()規(guī)則:如果線程A執(zhí)行ThreadB.join(),那么線程B中的所有操作happens-before ThreadB.join()

下面這個示例有助于理解happens-before

double pi = 3.14; //A
double r = 1.0; //B
double area = pi * r *r; //C

這里有三個happens-before關系,規(guī)則1、2是程序順序規(guī)則,規(guī)則3是傳遞性規(guī)則推導出來的:

A happens-before B B happens-before C A happens-before C

C依賴于A、B,但是A和B誰也不依賴。所以即使A和B重排序,執(zhí)行結果也不會發(fā)生變化,這種重排序,JMM是運行的。

下面兩種執(zhí)行順序的結果都是正確的。

Java中內存模型JMM的示例分析

以上是“Java中內存模型JMM的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


新聞名稱:Java中內存模型JMM的示例分析
網站URL:http://weahome.cn/article/jjcpjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部