讀書筆記-Java并發編程的藝術-第3章(Java內存模型)-第9節(Java內存模型綜述)

3.9 Java內存模型綜述

前面對Java內存模型的基礎知識和內存模型的具體實現進行了說明。下面對Java內存模型的相關知識做一個總結。

3.9.1 處理器的內存模型

順序一致性內存模型是一個理論參考模型,JMM和處理器內存模型在設計時通常會以順序一致性內存模型為參照。在設計時,JMM 和處理器內存模型會對順序一致性模型做一些放松,因為如果完全按照順序一致性模型來實現處理器和JMM,那么很多的處理器和編譯器優化都要被禁止,這對執行性能將會有很大的影響。

根據對不同類型的讀/寫操作組合的執行順序的放松,可以把常見處理器的內存模型劃分為如下幾種類型。

  • 放松程序中寫-讀操作的順序,由此產生了Total Store ordering內存模型(稱為TSO)。
  • 在上面的基礎上,繼續放松程序中寫-寫操作的順序,由此產生了Partial Store Order內存模型(簡稱為PSO)。
  • 在前面兩條的基礎上,繼續放松程序中讀-寫和讀-讀操作的順序,由此產生了Relaxed Memory Order 內存模型(簡稱為 RMO)和 PowerPC 內存模型。

注意,這里處理器對讀/寫操作的放松,是以兩個操作之間不存在數據依賴性為前提的(因為處理器要遵守as-if-serial語義,處理器不會對存在數據依賴性的兩個內存操作做重排序)。

下表展示了常見處理器內存模型的細節特征:

內存模型名稱對應的處理器Store-Load重排序Store-Store重排序Load-Load 和Load-Store重排序可以更早讀取到其他處理器的寫可以更早讀取到當前處理器的寫
TSOsparc-TSO X64YY
PSOsparc-PSOYYY
RMOia64YYYY
PowerPCPowerPCYYYYY

從上表中可以看到,所有處理器內存模型都允許寫-讀重排序,原因在第1章已經說明過:它們都使用了寫緩存區。寫緩存區可能導致寫-讀操作重排序。同時,我們可以看到這些處理器內存模型都允許更早讀到當前處理器的寫,原因同樣是因為寫緩存區。由于寫緩存區僅對當前處理器可見,這個特性導致當前處理器可以比其他處理器先看到臨時保存在自己寫緩存區中的寫。

上表中的各種處理器內存模型,從上到下,模型由強變弱。越是追求性能的處理器內存模型設計得會越弱。因為這些處理器希望內存模型對它們的束縛越少越好,這樣它們就可以做盡可能多的優化來提高性能。

由于常見的處理器內存模型比JMM要弱,Java編譯器在生成字節碼時,會在執行指令序列的適當位置插人內存屏障來限制處理器的重排序。同時,由于各種處理器內存模型的強弱不同,為了在不同的處理器平臺向程序員展示一個一致的內存模型,JMM 在不同的處理器中需要插人的內存屏障的數量和種類也不相同。下圖展示了JMM 在不同處理器內存模型中需要插入的內存屏障的示意圖。

JMM屏蔽了不同處理器內存模型的差異,它在不同的處理器平臺之上為Java程序員呈現了一個一致的內存模型。

在這里插入圖片描述

3.9.2 各種內存模型之間的關系

JMM是一個語言級的內存模型,處理器內存模型是硬件級的內存模型,順序一致性內存模型是一個理論參考模型。下面是語言內存模型、處理器內存模型和順序一致性內存模型的強弱對比示意圖,如下圖所示。

從圖中可以看出:常見的4種處理器內存模型比常用的3種語言內存模型要弱,處理器內存模型和語言內存模型都比順序一致性內存模型要弱。同處理器內存模型一樣,越是追求執行性能的語言,內存模型設計得會越弱。

在這里插入圖片描述

3.9.3 JMM 的內存可見性保證

按程序類型,Java程序的內存可見性保證可以分為下列3類。

  • 單線程程序。單線程程序不會出現內存可見性問題。編譯器、runtime和處理器會共同確保單線程程序的執行結果與該程序在順序一致性模型中的執行結果相同。
  • 正確同步的多線程程序。正確同步的多線程程序的執行將具有順序一致性(程序的護行結果與該程序在順序一致性內存模型中的執行結果相同)。這是JMM關注的重點,JMM 通過限制編譯器和處理器的重排序來為程序員提供內存可見性保證。
  • 末同步/未正確同步的多線程程序。JMM為它們機供了最小安全性保障;線程執行時讀取到的值,要么是之前某個線程寫入的值,要么是默認值(0、null、false)。

注意,最小安全性保障與64位數據的非原子性寫并不矛盾。它們是兩個不同的概念,它們“發生”的時間點也不同。最小安全性保證對象默認初始化之后(設置成員域為0、null或false),才會被任意線程使用。最小安全性“發生”在對象被任意線程使用之前。64位數據的非原子性寫“發生”在對象被多個線程使用的過程中(寫共享變量)。當發生問題時(處理器B看到僅僅被處理器A“寫了一半”的無效值),這里雖然處理器B讀取到一個被寫了一半的無效值,但這個值仍然是處理器A寫入的,只不過是處理器A還沒有寫完而已。最小安全性保證線程讀取到的值,要么是之前某個線程寫入的值,要么是默認值(0、null或false)。但最小安全性并不保證線程讀取到的值,一定是某個線程寫完后的值。最小安全性保證線程讀取到的值不會無中生有的冒出來,但并不保證線程讀取到的值一定是正確的。

下圖展示了這3類程序在JMM中與在順序一致性內存模型中的執行結果的異同。

只要多線程程序是正確同步的,JMM保證該程序在任意的處理器平臺上的執行結果,與該程序在順序一致性內存模型中的執行結果一致。

在這里插入圖片描述

3.9.4 JSR-133 對日內存模型的修補

JSR-133對JDK5之前的舊內存模型的修補主要有兩個。

  • 增強volatile的內存語義。舊內存模型允許volatile 變量與普通變量重排序。JSR-133嚴格限制volatile變量與普通變量的重排序,使volatile的寫-讀和鎖的釋放-獲取具有相同的內存語義。
  • 增強final的內存語義。在舊內存模型中,多次讀取同一個final變量的值可能會不相同。為此,JSR-133為final增加了兩個重排序規則。在保證final引用不會從構造函數內逸出的情況下,final具有了初始化安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39031.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ORB-SLAM2 安裝編譯運行(非 ROS)

安裝編譯 必備安裝工具 主要包括 cmake 、 git 、 gcc 、 g gcc 的全稱是 GNU Compiler Collection,它是由 GNU 推出的一款功能強大的、性能優越的 多平臺編譯器,是一個能夠編譯多種語言的編譯器。最開始 gcc 是作為 C 語言的編譯器(GNU …

如何將等保2.0的要求融入日常安全運維實踐中?

等保2.0的基本要求 等保2.0是中國網絡安全領域的基本國策和基本制度,它要求網絡運營商按照網絡安全等級保護制度的要求,履行相關的安全保護義務。等保2.0的實施得到了《中華人民共和國網絡安全法》等法律法規的支持,要求相關行業和單位必須按…

C#/WPF 自制白板工具

隨著電子屏幕技術的發展&#xff0c;普通的黑板已不再適用現在的教學和演示環境&#xff0c;電子白板應運而生。本篇使用WPF開發了一個電子白板工具&#xff0c;功能豐富&#xff0c;非常使用日常免費使用&#xff0c;或者進行再次開發。 示例代碼如下&#xff1a; Stack<St…

拓撲排序[講課留檔]

拓撲排序 拓撲排序要解決的問題是給一個有向無環圖的所有節點排序。 即在 A O E AOE AOE網中找關鍵路徑。 前置芝士&#xff01; 有向圖&#xff1a;有向圖中的每一個邊都是有向邊&#xff0c;即其中的每一個元素都是有序二元組。在一條有向邊 ( u , v ) (u,v) (u,v)中&…

JavaScript 動態網頁實例 —— 廣告效果

廣告是現代網頁設計中不可或缺的內容。廣告可以有很多種形式,但最終目的都是要吸引觀眾的注意力。盡管廣告少不了畫面、音效和廣告語等效果,但其實現主要還是應用JavaScript 代碼,只要很好掌握了JavaScript程序設計,剩下的就是創意和美工了。本章介紹幾種廣告效果,包括對聯…

ChatGPT 官方發布桌面端,向所有用戶免費開放

Open AI 官方已經發布了適用于 macOS 的 ChatGPT 桌面端應用。 此前&#xff0c;該應用一直處于測試階段&#xff0c;僅 Plus 付費訂閱用戶可以使用。 目前已面向所有用戶開放&#xff0c;所有 Mac 用戶均可免費下載使用。 我們可以訪問官網下載安裝包&#xff1a;https://op…

Java利用poi實現word,excel,ppt,pdf等各類型文檔密碼檢測

介紹 最近工作上需要對word,excel,ppt,pdf等各類型文檔密碼檢測&#xff0c;對文件進行分類&#xff0c;有密碼的和沒密碼的做區分。查了一堆資料和GPT都不是很滿意&#xff0c;最后東拼西湊搞了個相對全面的檢測工具代碼類&#xff0c;希望能給需要的人帶來幫助。 說明 這段…

PHP 爬蟲之使用 Curl庫抓取淘寶商品列表數據網頁的方法

使用 PHP 的 cURL 庫來抓取淘寶商品列表數據網頁需要謹慎&#xff0c;因為淘寶等電商平臺通常會有反爬蟲機制&#xff0c;以防止數據被濫用。然而&#xff0c;如果你只是出于學習目的&#xff0c;并且了解并遵守了淘寶的robots.txt文件和相關的使用條款&#xff0c;你可以嘗試使…

2024 年江西省研究生數學建模競賽題目 B題投標中的競爭策略問題--完整思路、代碼結果分享(僅供學習)

招投標問題是企業運營過程中必須面對的基本問題之一。現有的招投標平臺有國家級的&#xff0c;也有地方性的。在招投標過程中&#xff0c;企業需要全面了解招標公告中的相關信息&#xff0c;在遵守招投標各種規范和制度的基礎上&#xff0c;選擇有效的競爭策略和技巧&#xff0…

基于JSP技術的校園餐廳管理系統

開頭語&#xff1a; 你好呀&#xff0c;我是計算機學長貓哥&#xff01;如果您對校園餐廳管理系統感興趣或有相關需求&#xff0c;歡迎隨時聯系我。我的聯系方式在文末&#xff0c;期待與您交流&#xff01; 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#x…

QT的編譯過程

qmake -project 用于從源代碼生成項目文件&#xff0c;qmake 用于從項目文件生成 Makefile&#xff0c;而 make 用于根據 Makefile 構建項目。 詳細解釋&#xff1a; qmake -project 這個命令用于從源代碼目錄生成一個初始的 Qt 項目文件&#xff08;.pro 文件&#xff09;。它…

Keil5中:出現:failed to execute ‘...\ARMCC\bin\ArmCC‘

點三個點&#xff0c;去自己的磁盤找自己的ARM\ARMCC\bin

深入解析:計算機系統總線全方位解讀

在計算機組成原理中&#xff0c;總線系統是連接計算機各個部件的重要通道。本文將詳細介紹系統總線的基本概念、分類、特性及性能指標、結構和控制方式。希望通過本文的講解&#xff0c;能夠幫助基礎小白更好地理解計算機系統總線的工作原理。 系統總線 (System Bus) 系統總線…

查看視頻時間基 time_base

時間基、codec, 分辨率&#xff0c;音頻和視頻的都一樣&#xff0c;才可以直接使用ffmpeg -f concat -i file.txt 方式合并。 On Thu, Dec 03, 2015 at 21:54:53 0200, redneb8888 wrote: I am looking for a way to find the time base of a stream (video or audio), $ ffpr…

selenium 簡介以及 selenium 環境配置

文章目錄 一、初識 selenium1.selenium 簡介2.selenium 三大組件3.selenium工作過程和原理4.selenium自動化測試流程5.selenium優點 二、自動化測試1.UI自動化本質2.UI自動化的前提3.適用場景4.UI自動化的原則5.UI自動化的覆蓋率 三、selenium 環境配置 一、初識 selenium 1.s…

單點登錄demo

gitee.com 搜索xxl(許雪里) 的sso 操作demo 完整流程圖

網絡安全控制相關技術

1.惡意代碼&#xff08;Malware&#xff09; 網絡從出現、發展演進都始終伴隨著安全方面的問題&#xff0c;只是每個階段表現的形式不同而已。在網絡安全方面&#xff0c;不能不提進行網絡攻擊的網絡病毒&#xff0c;或者說惡意代碼&#xff08;Malware&#xff09;。所有惡意…

MySQL中的網絡命名空間支持

Network Namespace Support&#xff08;網絡命名空間支持&#xff09; 提供了在Linux系統中創建和管理多個隔離網絡空間的能力。網絡命名空間是來自主機系統的網絡堆棧的邏輯副本。網絡命名空間對于設置容器或虛擬環境非常有用。每個名稱空間都有自己的IP地址、網絡接口、路由表…

什么是應用安全態勢管理 (ASPM):綜合指南

軟件開發在不斷發展&#xff0c;應用程序安全也必須隨之發展。 傳統的應用程序安全解決方案無法跟上當今開發人員的工作方式或攻擊者的工作方式。 我們需要一種新的應用程序安全方法&#xff0c;而ASPM在該方法中發揮著關鍵作用。 什么是 ASPM&#xff1f; 應用程序安全…

配電智能網關賦能電力系統智能化運行維護

隨著智能電網和物聯網技術的不斷發展&#xff0c;兩者之間的融合應用成為電力行業的重要趨勢。配電智能網關作為連接兩者的關鍵設備&#xff0c;在智能電網的物聯網應用中發揮著重要作用。 配電智能網關能夠實現對電力系統的實時監控、數據采集、遠程控制等功能&#xff0c;為…