少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(22)

          我參與的團隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Java 內(nèi)存模型

          由于 ConcurrentHashMap 是建立在 Java 內(nèi)存模型基礎(chǔ)上的,為了更好的理解 ConcurrentHashMap,讓我們首先來了解一下 Java 的內(nèi)存模型。

          Java 語言的內(nèi)存模型由一些規(guī)則組成,這些規(guī)則確定線程對內(nèi)存的訪問如何排序以及何時可以確保它們對線程是可見的。下面我們將分別介紹 Java 內(nèi)存模型的重排序,內(nèi)存可見性和 happens-before 關(guān)系。

          重排序

          內(nèi)存模型描述了程序的可能行為。具體的編譯器實現(xiàn)可以產(chǎn)生任意它喜歡的代碼 -- 只要所有執(zhí)行這些代碼產(chǎn)生的結(jié)果,能夠和內(nèi)存模型預(yù)測的結(jié)果保持一致。這為編譯器實現(xiàn)者提供了很大的自由,包括操作的重排序。

          編譯器生成指令的次序,可以不同于源代碼所暗示的“顯然”版本。重排序后的指令,對于優(yōu)化執(zhí)行以及成熟的全局寄存器分配算法的使用,都是大有脾益的,它使得程序在計算性能上有了很大的提升。

          重排序類型包括:

          • 編譯器生成指令的次序,可以不同于源代碼所暗示的“顯然”版本。
          • 處理器可以亂序或者并行的執(zhí)行指令。
          • 緩存會改變寫入提交到主內(nèi)存的變量的次序。

          內(nèi)存可見性

          由于現(xiàn)代可共享內(nèi)存的多處理器架構(gòu)可能導(dǎo)致一個線程無法馬上(甚至永遠(yuǎn))看到另一個線程操作產(chǎn)生的結(jié)果。所以 Java 內(nèi)存模型規(guī)定了 JVM 的一種最小保證:什么時候?qū)懭胍粋€變量對其他線程可見。

          在現(xiàn)代可共享內(nèi)存的多處理器體系結(jié)構(gòu)中每個處理器都有自己的緩存,并周期性的與主內(nèi)存協(xié)調(diào)一致。假設(shè)線程 A 寫入一個變量值 V,隨后另一個線程 B 讀取變量 V 的值,在下列情況下,線程 B 讀取的值可能不是線程 A 寫入的最新值:

          • 執(zhí)行線程 A 的處理器把變量 V 緩存到寄存器中。
          • 執(zhí)行線程 A 的處理器把變量 V 緩存到自己的緩存中,但還沒有同步刷新到主內(nèi)存中去。
          • 執(zhí)行線程 B 的處理器的緩存中有變量 V 的舊值。

          Happens-before 關(guān)系

          happens-before 關(guān)系保證:如果線程 A 與線程 B 滿足 happens-before 關(guān)系,則線程 A 執(zhí)行動作的結(jié)果對于線程 B 是可見的。如果兩個操作未按 happens-before 排序,JVM 將可以對他們?nèi)我庵嘏判颉?/p>

          下面介紹幾個與理解 ConcurrentHashMap 有關(guān)的 happens-before 關(guān)系法則:

          1. 程序次序法則:如果在程序中,所有動作 A 出現(xiàn)在動作 B 之前,則線程中的每動作 A 都 happens-before 于該線程中的每一個動作 B。
          2. 監(jiān)視器鎖法則:對一個監(jiān)視器的解鎖 happens-before 于每個后續(xù)對同一監(jiān)視器的加鎖。
          3. Volatile 變量法則:對 Volatile 域的寫入操作 happens-before 于每個后續(xù)對同一 Volatile 的讀操作。
          4. 傳遞性:如果 A happens-before 于 B,且 B happens-before C,則 A happens-before C。
          posted on 2015-03-22 12:40 abin 閱讀(1086) 評論(0)  編輯  收藏 所屬分類: JVM
          主站蜘蛛池模板: 玉树县| 海门市| 紫金县| 濮阳县| 区。| 塔城市| 丰台区| 平阴县| 杭锦后旗| 唐河县| 白山市| 凤山市| 中江县| 双峰县| 石楼县| 武隆县| 东平县| 北辰区| 安康市| 石狮市| 博客| 桦川县| 板桥市| 林口县| 萨嘎县| 房产| 微山县| 景德镇市| 易门县| 武功县| 石景山区| 依安县| 友谊县| 黑龙江省| 蚌埠市| 五大连池市| 古丈县| 新野县| 吉安县| 徐汇区| SHOW|