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

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


咨詢
建站咨詢
