溫馨提示×

溫馨提示×

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

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

Java內(nèi)存模型有什么作用

發(fā)布時(shí)間:2023-04-27 14:30:09 來源:億速云 閱讀:174 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java內(nèi)存模型有什么作用”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Java內(nèi)存模型有什么作用”文章能幫助大家解決問題。

什么是JMM

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

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

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

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

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

Java內(nèi)存模型有什么作用

主存與工作內(nèi)存

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

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

volatile 關(guān)鍵字有什么用

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

  • 可見性

    初始變量首先存儲(chǔ)在主內(nèi)存中;

    線程操作變量需要從主內(nèi)存拷貝到線程本地內(nèi)存中;

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

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

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

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

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

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

    • 區(qū)別在于:volatile的特殊規(guī)則保證了volatile變量值修改后的新值立刻同步到主內(nèi)存,每次使用volatile變量前立即從主內(nèi)存中刷新,因此volatile保證了多線程之間的操作變量的可見性,而普通變量則不能保證這一點(diǎn)。

  • 除了volatile關(guān)鍵字能實(shí)現(xiàn)可見性之外,還有synchronized,Lock,final(不可變) 也是可以的

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

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

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

關(guān)于“Java內(nèi)存模型有什么作用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI