在java中提到記憶體很多人都會想到jvm,本篇要說的記憶體模型也會被誤解成是這個。其實,這也是面試中比較容易出錯的一個考點,記憶體模型的簡稱是jmm,相信如果是以英文名稱展現還是不容易混淆的。下面我們就Java記憶體模型的概念進行解說,同時幫助大家做一個它和jvm的區分。
1、概念
Java記憶體模型(Java Main Memory簡稱JMM)是一個抽象概念,和電腦的記憶體模型有很多相似的地方。 JMM主要包括線程、工作內存、主內存三者來交互,其中工作內存可以類比計算的高速緩存,不過線程間工作內存是互相獨立的;主內存類比計算機的主內存,線程間變量值傳遞主要是透過主內存來完成的。同時JMM也有優化程式碼執行順序的指令重新排序。簡單的說就是程式碼的編寫順序不一定就是程式碼的執行順序。
2、JMM與JVM的區分
Java記憶體模型看起來跟Java記憶體結構(JVM記憶體結構)差不多,很多人會誤以為兩者是一回事,這也導致面試過程中經常答非所為。
Java堆和方法區的區域是多個執行緒共享的資料區域。也就是說,多個執行緒可能可以操作保存在堆或方法區中的同一個資料。這也就是我們常說的「Java的線程間透過共享記憶體進行通訊」。
Java記憶體模型是根據英文Java Memory Model(JMM)翻譯過來的。其實JMM並不像JVM記憶體結構一樣是真實存在的。他只是一個抽象的概念。 JSR-133: Java Memory Model and Thread Specification中描述了,JMM是和多線程相關的,他描述了一組規則或規範,這個規範定義了一個線程對共享變量的寫入時對另一個線程是可見的。
那麼,簡單總結下,Java的多線程之間是透過共享記憶體進行通信的,而由於採用共享記憶體進行通信,在通信過程中會存在一系列如可見性、原子性、順序性等問題,而JMM就是圍繞著多執行緒通訊以及與其相關的一系列特性而建立的模型。 JMM定義了一些語法集,這些語法集映射到Java語言中就是volatile、synchronized等關鍵字。
以上就是java中記憶模型的相關介紹,本篇著重於基礎的理論分享,大家可以重點對jmm和jvm進行區分,日後學習時也能對這兩個概念更加明確。