新聞中心
Java內(nèi)存模型(Java Memory Model,JMM)是Java虛擬機(jī)規(guī)范中定義的一個(gè)概念模型,它描述了Java程序在多線(xiàn)程環(huán)境下如何和何時(shí)看到其他線(xiàn)程寫(xiě)入的值,以及如何同步訪(fǎng)問(wèn)共享變量,Java內(nèi)存模型規(guī)定了主內(nèi)存和每個(gè)線(xiàn)程的本地內(nèi)存之間的關(guān)系,以及它們之間的交互操作。

創(chuàng)新互聯(lián)建站是一家專(zhuān)業(yè)從事成都網(wǎng)站建設(shè)、成都做網(wǎng)站的網(wǎng)絡(luò)公司。作為專(zhuān)業(yè)網(wǎng)站設(shè)計(jì)公司,創(chuàng)新互聯(lián)建站依托的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營(yíng)經(jīng)驗(yàn),為您提供專(zhuān)業(yè)的成都網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷(xiāo)推廣及網(wǎng)站設(shè)計(jì)開(kāi)發(fā)服務(wù)!
主內(nèi)存與工作內(nèi)存
Java內(nèi)存模型將內(nèi)存劃分為兩種:主內(nèi)存和工作內(nèi)存,所有的變量都存儲(chǔ)在主內(nèi)存中,每個(gè)線(xiàn)程都有自己的工作內(nèi)存,線(xiàn)程的工作內(nèi)存中保存了被該線(xiàn)程使用到的變量的主內(nèi)存副本拷貝,線(xiàn)程對(duì)變量的所有操作都必須在工作內(nèi)存中進(jìn)行,然后再將變量寫(xiě)回主內(nèi)存,不同的線(xiàn)程之間無(wú)法直接訪(fǎng)問(wèn)對(duì)方工作內(nèi)存中的變量,線(xiàn)程間變量的傳遞均需要通過(guò)主內(nèi)存來(lái)完成。
內(nèi)存間的交互操作
Java內(nèi)存模型定義了8種操作來(lái)完成變量在主內(nèi)存和工作內(nèi)存之間的交互過(guò)程:
1、lock(鎖定):把一個(gè)變量標(biāo)識(shí)為一條線(xiàn)程獨(dú)占的狀態(tài)。
2、unlock(解鎖):把一個(gè)處于鎖定狀態(tài)的變量釋放出來(lái),讓其他線(xiàn)程也能訪(fǎng)問(wèn)。
3、read(讀?。喊岩粋€(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)焦ぷ鲀?nèi)存中,以便隨后的load操作。
4、load(加載):把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中。
5、use(使用):把工作內(nèi)存中的一個(gè)變量的值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個(gè)需要使用變量的值的字節(jié)碼指令時(shí)將會(huì)執(zhí)行這個(gè)操作。
6、assign(賦值):把一個(gè)從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個(gè)給變量賦值的字節(jié)碼指令時(shí)將會(huì)執(zhí)行這個(gè)操作。
7、store(存儲(chǔ)):把工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的write操作。
8、write(寫(xiě)入):把store操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。
原子性、可見(jiàn)性和有序性
Java內(nèi)存模型為程序員提供了以下三個(gè)保證:
1、原子性:即一個(gè)操作或者多個(gè)操作要么全部執(zhí)行并且執(zhí)行的過(guò)程不會(huì)被任何因素打斷,要么就都不執(zhí)行。
2、可見(jiàn)性:指當(dāng)一個(gè)線(xiàn)程修改了一個(gè)共享變量的值,新值對(duì)于其他線(xiàn)程來(lái)說(shuō)是可以立即得知的。
3、有序性:即程序按照代碼的先后順序執(zhí)行。
先行發(fā)生原則
先行發(fā)生原則是指,如果兩個(gè)操作訪(fǎng)問(wèn)同一個(gè)變量,且第一個(gè)操作為寫(xiě)操作,第二個(gè)操作為讀操作,那么第一個(gè)操作的結(jié)果將對(duì)第二個(gè)操作產(chǎn)生直接影響,線(xiàn)程A修改了一個(gè)共享變量的值,然后線(xiàn)程B讀取這個(gè)共享變量的值,那么線(xiàn)程B讀取到的值將是線(xiàn)程A剛剛寫(xiě)入的值。
volatile關(guān)鍵字
volatile是一個(gè)類(lèi)型修飾符,用于修飾被不同線(xiàn)程訪(fǎng)問(wèn)和修改的變量,它有以下兩個(gè)特性:
1、保證此變量對(duì)所有線(xiàn)程的可見(jiàn)性,即一旦有線(xiàn)程修改了這個(gè)變量的值,新值對(duì)于其他線(xiàn)程來(lái)說(shuō)是可以立即得知的。
2、禁止進(jìn)行指令重排序優(yōu)化,編譯器、運(yùn)行時(shí)和處理器會(huì)在合適的地方插入內(nèi)存屏障來(lái)禁止特定類(lèi)型的數(shù)據(jù)重排序。
synchronized關(guān)鍵字
synchronized關(guān)鍵字用于實(shí)現(xiàn)同步訪(fǎng)問(wèn)共享資源,它可以保證同一時(shí)刻最多只有一個(gè)線(xiàn)程執(zhí)行該段代碼,從而保證數(shù)據(jù)的一致性,synchronized可以修飾方法和代碼塊,當(dāng)它用來(lái)修飾方法或者一個(gè)代碼塊時(shí),能夠鎖住整個(gè)對(duì)象或者類(lèi),鎖的范圍為整個(gè)方法或代碼塊;當(dāng)它用來(lái)修飾一個(gè)實(shí)例變量時(shí),鎖住的是這個(gè)實(shí)例變量所對(duì)應(yīng)的對(duì)象。
final關(guān)鍵字
final關(guān)鍵字可以用于修飾類(lèi)、方法和變量,當(dāng)final修飾一個(gè)類(lèi)時(shí),表示這個(gè)類(lèi)不能被繼承;當(dāng)final修飾一個(gè)方法時(shí),表示這個(gè)方法不能被覆蓋重寫(xiě);當(dāng)final修飾一個(gè)基本類(lèi)型或者引用類(lèi)型時(shí),表示這個(gè)變量的值一旦賦值之后就不能被修改,final關(guān)鍵字可以提高性能,因?yàn)榫幾g器在處理帶final關(guān)鍵字的方法或者類(lèi)時(shí)會(huì)進(jìn)行一些優(yōu)化。
問(wèn)題與解答
Q1:Java內(nèi)存模型中的主內(nèi)存和工作內(nèi)存有什么區(qū)別?
A1:主內(nèi)存是所有變量存儲(chǔ)的地方,而每個(gè)線(xiàn)程都有自己的工作內(nèi)存,其中保存了被該線(xiàn)程使用到的變量的主內(nèi)存副本拷貝,線(xiàn)程對(duì)變量的所有操作都必須在工作內(nèi)存中進(jìn)行,然后再將變量寫(xiě)回主內(nèi)存,不同的線(xiàn)程之間無(wú)法直接訪(fǎng)問(wèn)對(duì)方工作內(nèi)存中的變量,線(xiàn)程間變量的傳遞均需要通過(guò)主內(nèi)存來(lái)完成。
Q2:Java內(nèi)存模型中的8種操作是什么?它們的作用分別是什么?
A2:Java內(nèi)存模型中的8種操作分別是lock、unlock、read、load、use、assign、store和write,它們的作用如下:lock和unlock用于把一個(gè)變量標(biāo)識(shí)為一條線(xiàn)程獨(dú)占的狀態(tài);read和load用于把一個(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)焦ぷ鲀?nèi)存中;use用于把工作內(nèi)存中的一個(gè)變量的值傳遞給執(zhí)行引擎;assign用于把一個(gè)從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量;store和write用于把工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存中。
本文名稱(chēng):java內(nèi)存模型包含什么內(nèi)容
網(wǎng)址分享:http://fisionsoft.com.cn/article/djegphd.html


咨詢(xún)
建站咨詢(xún)
