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

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


咨詢
建站咨詢
