搜尋
首頁Javajava教程Java記憶體模型有什麼作用

Java記憶體模型有什麼作用

May 09, 2023 am 09:01 AM
java

什麼是JMM

  • JMM全名為Java Memory Model, 中文翻譯Java記憶體模型,一種符合記憶體模型規範的,屏蔽了各種硬體和作業系統的存取差異的,確保了Java程式在各種平台下對記憶體的存取都能保證效果一致的機制及規格。

  • Java記憶體模型規定了所有的變數都儲存在主記憶體中,每個執行緒還有自己的工作記憶體。

  • 線程的工作記憶體中保存了該執行緒中是用到的變數的主記憶體副本拷貝,執行緒對變數的所有操作都必須在工作記憶體中進行,而不能直接讀寫主記憶體。

  • 不同的執行緒之間也無法直接存取對方工作記憶體中的變量,執行緒間變數的傳遞均需要自己的工作記憶體和主記憶體之間進行資料同步進行。

  • 而JMM作用於工作記憶體和主記憶體之間資料同步過程。他規定瞭如何做資料同步以及何時做資料同步。

Java記憶體模型有什麼作用

主存與工作記憶體

  • #主記憶體和工作內存,可以簡單的類比成計算機記憶體模型中的主存和快取的概念。特別要注意的是,主記憶體和工作記憶體與JVM記憶體結構中的Java堆、堆疊、方法區等並不是同一個層次的記憶體劃分,無法直接類比。

  • 如果一定要勉強對應的話,從變數、主記憶體、工作記憶體的定義來看,主記憶體主要對應於Java堆中的物件實例資料部分。工作記憶體則對應於虛擬機器棧中的部分區域。

volatile 關鍵字有什麼用

  • #保證資料記憶體可見性

  • 可見性

    初始變數首先儲存在主記憶體中;

    執行緒操作變數需要從主記憶體拷貝到執行緒本地記憶體中;

    執行緒的本地工作記憶體是一個抽象概念,包括了快取、store buffer(後面會講到)、暫存器等。

  • 線程A與線程B之間要通訊的話,必須經歷下面2個步驟:

    線程A把本地記憶體A中更新過的共享變數刷新到主記憶體中去。

    線程B到主記憶體中去讀取線程A之前已更新過的共享變數。

一個執行緒對共享變數做了修改之後,其他的執行緒能夠看到(感知到)該變數的這種修改(變化)

  • ##無論是普通變數還是volatile變數都是如此

    • 區別在於:volatile的特殊規則保證了volatile變數值修改後的新值立刻同步到主內存,每次使用volatile變數前立即從主記憶體刷新,因此volatile保證了多執行緒之間的操作變數的可見性,而普通變數則不能保證這一點。

  • 除了volatile關鍵字能實現可見性之外,還有synchronized,Lock,

    final(不可變) 也是可以的

    使用synchronized關鍵字,在同步方法/同步區塊開始時(Monitor Enter),使用共享變數時會從主記憶體刷新變數值到工作記憶體中(即從主記憶體讀取最新值到執行緒私有的工作記憶體中),在同步方法/同步區塊結束時(Monitor Exit),會將工作記憶體中的變數值同步到主記憶體中去(即將執行緒私有的工作記憶體中的值寫入到主記憶體進行同步) .

    使用Lock介面的最常用的實作ReentrantLock(重入鎖)來實現可見性:當我們在方法的開始位置執行lock.lock()方法,這和synchronized開始位置(Monitor Enter)有相同的語義,即使用共享變數時會從主記憶體刷新變數值到工作記憶體中(即從主記憶體中讀取最新值到線程私有的工作記憶體中),在方法的最後finally區塊執行lock .unlock()方法,和synchronized結束位置(Monitor Exit)有相同的語意,即會將工作記憶體中的變數值同步到主記憶體中去(即將執行緒私有的工作記憶體中的值寫入到主記憶體進行同步)。

    final關鍵字的可見性是指:被final修飾的變量,在建構函式數一旦初始化完成,並且在建構函式中並沒有把「this」的引用傳遞出去(「this」引用逃逸是很危險的,其他的執行緒很可能透過該引用訪問只「初始化一半」的物件),那麼其他執行緒就可以看到final變數的值。

  • #

以上是Java記憶體模型有什麼作用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具