中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java內存模型有什么作用

發布時間:2023-04-27 14:30:09 來源:億速云 閱讀:217 作者:iii 欄目:開發技術

這篇文章主要介紹“Java內存模型有什么作用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“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內存模型有什么作用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高雄市| 临潭县| 湖口县| 沙雅县| 科技| 永川市| 汉川市| 怀柔区| 永州市| 福海县| 诸暨市| 蒙山县| 南投县| 云梦县| 渑池县| 巴南区| 汶川县| 裕民县| 扎囊县| 通道| 舟曲县| 丁青县| 丘北县| 腾冲县| 嘉义市| 开封市| 偏关县| 剑川县| 溧水县| 张北县| 钟山县| 井陉县| 南宁市| 阿瓦提县| 锦屏县| 南京市| 尼勒克县| 南澳县| 西盟| 巴林右旗| 汉川市|