欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java內存模型詳解

 更新時間:2023年04月27日 11:25:19   作者:在下uptown  
JMM全稱Java Memory Model, 中文翻譯Java內存模型,一種符合內存模型規(guī)范的,屏蔽了各種硬件和操作系統(tǒng)的訪問差異的,本詳細介紹了Java內存模型,感興趣的同學可以參考一下

什么是JMM

  • JMM全稱Java Memory Model, 中文翻譯Java內存模型,一種符合內存模型規(guī)范的,屏蔽了各種硬件和操作系統(tǒng)的訪問差異的,保證了Java程序在各種平臺下對內存的訪問都能保證效果一致的機制及規(guī)范。

  • Java內存模型規(guī)定了所有的變量都存儲在主內存中,每條線程還有自己的工作內存。

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

  • 不同的線程之間也無法直接訪問對方工作內存中的變量,線程間變量的傳遞均需要自己的工作內存和主存之間進行數(shù)據(jù)同步進行。

  • 而JMM作用于工作內存和主存之間數(shù)據(jù)同步過程。他規(guī)定了如何做數(shù)據(jù)同步以及什么時候做數(shù)據(jù)同步。

主存與工作內存

  • 主內存和工作內存,可以簡單的類比成計算機內存模型中的主存和緩存的概念。特別需要注意的是,主內存和工作內存與JVM內存結構中的Java堆、棧、方法區(qū)等并不是同一個層次的內存劃分,無法直接類比。

  • 如果一定要勉強對應起來的話,從變量、主內存、工作內存的定義來看,主內存主要對應于Java堆中的對象實例數(shù)據(jù)部分。工作內存則對應于虛擬機棧中的部分區(qū)域。

volatile 關鍵字有什么用

  • 保證數(shù)據(jù)內存可見性
  • 可見性

    初始變量首先存儲在主內存中;

    線程操作變量需要從主內存拷貝到線程本地內存中;

    線程的本地工作內存是一個抽象概念,包括了緩存、store buffer(后面會講到)、寄存器等。

  • 線程A與線程B之間要通信的話,必須要經(jīng)歷下面2個步驟:

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

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

一個線程對共享變量做了修改之后,其他的線程能夠看到(感知到)該變量的這種修改(變化)

  • 無論是普通變量還是volatile變量都是如此
    • 區(qū)別在于:volatile的特殊規(guī)則保證了volatile變量值修改后的新值立刻同步到主內存,每次使用volatile變量前立即從主內存中刷新,因此volatile保證了多線程之間的操作變量的可見性,而普通變量則不能保證這一點。
  • 除了volatile關鍵字能實現(xiàn)可見性之外,還有synchronized,Lock,final(不可變) 也是可以的

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

    使用Lock接口的最常用的實現(xiàn)ReentrantLock(重入鎖)來實現(xiàn)可見性:當我們在方法的開始位置執(zhí)行l(wèi)ock.lock()方法,這和synchronized開始位置(Monitor Enter)有相同的語義,即使用共享變量時會從主內存中刷新變量值到工作內存中(即從主內存中讀取最新值到線程私有的工作內存中),在方法的最后finally塊里執(zhí)行l(wèi)ock.unlock()方法,和synchronized結束位置(Monitor Exit)有相同的語義,即會將工作內存中的變量值同步到主內存中去(即將線程私有的工作內存中的值寫入到主內存進行同步)。

    final關鍵字的可見性是指:被final修飾的變量,在構造函數(shù)數(shù)一旦初始化完成,并且在構造函數(shù)中并沒有把“this”的引用傳遞出去(“this”引用逃逸是很危險的,其他的線程很可能通過該引用訪問到只“初始化一半”的對象),那么其他線程就可以看到final變量的值。

到此這篇關于Java內存模型詳解的文章就介紹到這了,更多相關Java內存模型內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • EditPlus運行java時從鍵盤輸入數(shù)據(jù)的操作方法

    EditPlus運行java時從鍵盤輸入數(shù)據(jù)的操作方法

    這篇文章主要介紹了EditPlus運行java時從鍵盤輸入數(shù)據(jù)的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • JUnit 5中擴展模型的深入理解

    JUnit 5中擴展模型的深入理解

    幾乎所有的Java 開發(fā)人員都會使用JUnit 來做測試,但其實很多自動化測試人員也會使用Junit 。下面這篇文章主要給大家介紹了關于JUnit 5中擴展模型的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08
  • Java 中 Form表單數(shù)據(jù)的兩種提交方式

    Java 中 Form表單數(shù)據(jù)的兩種提交方式

    本文給大家分享java中form表單數(shù)據(jù)的兩種提交方式,分別是get從制定的服務器中獲取數(shù)據(jù),pos方式提交數(shù)據(jù)給指定的服務器處理,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2016-12-12
  • SpringCloud Config分布式配置中心使用教程介紹

    SpringCloud Config分布式配置中心使用教程介紹

    springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應用
    2022-12-12
  • SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    這篇文章主要介紹了SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • Java中的集合ArrayList類常用方法和遍歷

    Java中的集合ArrayList類常用方法和遍歷

    這篇文章主要介紹了Java中的集合ArrayList類常用方法和遍歷,ArrayList 是大小可變的數(shù)組的實現(xiàn),存儲在內的數(shù)據(jù)稱為元素,此類提供一些方法來操作內部存儲的元素, ArrayList中可不斷添加元素,其大小也自動增長,需要的朋友可以參考下
    2024-01-01
  • 詳解Spring Boot 中實現(xiàn)定時任務的兩種方式

    詳解Spring Boot 中實現(xiàn)定時任務的兩種方式

    這篇文章主要介紹了Spring Boot 中實現(xiàn)定時任務的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 解讀查看zookeeper事務日志的正確姿勢

    解讀查看zookeeper事務日志的正確姿勢

    這篇文章主要介紹了解讀查看zookeeper事務日志的正確姿勢。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Spring中的事務攔截器順序如何控制詳解

    Spring中的事務攔截器順序如何控制詳解

    這篇文章主要介紹了Spring中的事務攔截器順序如何控制詳解,那么spring事務攔截器的順序如何控制呢,若我們自己也添加了一些攔截器,此時事務攔截器和自定義攔截器共存的時候,他們的順序是怎么執(zhí)行的?如何手動來控制他們的順序,需要的朋友可以參考下
    2024-01-01
  • 手把手帶你入門 Spring Security的具體流程

    手把手帶你入門 Spring Security的具體流程

    這篇文章主要介紹了手把手帶你入門 Spring Security,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論