Java并發編程的藝術》 —3.1.2 Java內存模型的抽象結構

      網友投稿 846 2025-04-02

      3.1.2 Java內存模型的抽象結構


      在Java中,所有實例域、靜態域和數組元素都存儲在堆內存中,堆內存在線程之間共享(本章用“共享變量”這個術語代指實例域,靜態域和數組元素)。局部變量(Local Variables),方法定義參數(Java語言規范稱之為Formal Method Parameters)和異常處理器參數(Exception Handler Parameters)不會在線程之間共享,它們不會有內存可見性問題,也不受內存模型的影響。

      Java線程之間的通信由Java內存模型(本文簡稱為JMM)控制,JMM決定一個線程對共享變量的寫入何時對另一個線程可見。從抽象的角度來看,JMM定義了線程和主內存之間的抽象關系:線程之間的共享變量存儲在主內存(Main Memory)中,每個線程都有一個私有的本地內存(Local Memory),本地內存中存儲了該線程以讀/寫共享變量的副本。本地內存是JMM的一個抽象概念,并不真實存在。它涵蓋了緩存、寫緩沖區、寄存器以及其他的硬件和編譯器優化。Java內存模型的抽象示意如圖3-1所示。

      圖3-1 Java內存模型的抽象結構示意圖

      從圖3-1來看,如果線程A與線程B之間要通信的話,必須要經歷下面2個步驟。

      1)線程A把本地內存A中更新過的共享變量刷新到主內存中去。

      2)線程B到主內存中去讀取線程A之前已更新過的共享變量。

      下面通過示意圖(見圖3-2)來說明這兩個步驟。

      圖3-2 線程之間的通信圖

      如圖3-2所示,本地內存A和本地內存B由主內存***享變量x的副本。假設初始時,這3個內存中的x值都為0。線程A在執行時,把更新后的x值(假設值為1)臨時存放在自己的本地內存A中。當線程A和線程B需要通信時,線程A首先會把自己本地內存中修改后的x值刷新到主內存中,此時主內存中的x值變為了1。隨后,線程B到主內存中去讀取線程A更新后的x值,此時線程B的本地內存的x值也變為了1。

      從整體來看,這兩個步驟實質上是線程A在向線程B發送消息,而且這個通信過程必須要經過主內存。JMM通過控制主內存與每個線程的本地內存之間的交互,來為Java程序員提供內存可見性保證。

      《Java并發編程的藝術》 —3.1.2 Java內存模型的抽象結構

      Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS讓文字在兩個文本框內滑動的方法介紹
      下一篇:Word制作借款單實例教程(借用單怎么寫)
      相關文章
      亚洲综合综合在线| 亚洲婷婷综合色高清在线| 色噜噜亚洲男人的天堂| 久久精品蜜芽亚洲国产AV| 亚洲AV无码久久| 久久99国产亚洲高清观看首页| 亚洲女初尝黑人巨高清| 亚洲中久无码永久在线观看同| 自拍偷自拍亚洲精品情侣| 亚洲天堂中文字幕在线| 亚洲精品无码你懂的网站| 亚洲精品无码久久不卡| 中文字幕亚洲日韩无线码| 亚洲综合国产一区二区三区| 亚洲欧洲精品无码AV| 亚洲精品~无码抽插| 久久亚洲国产伦理| 久久久久久亚洲精品成人| 亚洲精品在线网站| 亚洲jizzjizz在线播放久| 亚洲中文无码永久免| 亚洲av无码成人精品国产| 成人伊人亚洲人综合网站222| 亚洲第一黄色网址| 浮力影院亚洲国产第一页| 亚洲精品国产精品乱码视色| 亚洲va久久久噜噜噜久久| 亚洲综合视频在线| 亚洲午夜成激人情在线影院| 亚洲综合色丁香婷婷六月图片 | 亚洲爆乳无码专区| 亚洲人成在线播放网站岛国| 亚洲视频在线一区二区三区| 亚洲人成电影院在线观看| 亚洲日本一线产区和二线产区对比| 亚洲精华液一二三产区| 亚洲国产成人爱av在线播放| 国产亚洲日韩在线三区| 亚洲午夜久久久精品影院| 亚洲一区中文字幕在线观看| 亚洲成a人片在线观看天堂无码|