Java內(nèi)存模型JMM
Java內(nèi)存模型(即Java Memory Model ,簡稱JMM)本身是一種抽象的概念,并不真實存在,它描述的是- -組規(guī)則或規(guī)范,通過這組規(guī)范定義了程序中各個變量(包括實例字段,靜態(tài)字段和構(gòu)成數(shù)組對象的元素)的訪問方式。
JVM的運行實體是線程,每個線程創(chuàng)建時,JVM為其創(chuàng)造一個工作內(nèi)存,用于存儲線程私有的數(shù)據(jù),而java內(nèi)存模型規(guī)定所有內(nèi)存變量存儲在主內(nèi)存中,主內(nèi)存是共享內(nèi)存區(qū)域,所有線程都可以訪問,但線程對變量的操作必須在工作內(nèi)存中進(jìn)行,首先將變量從主內(nèi)存拷貝到自己的工作內(nèi)存中并進(jìn)行操作,操作完成后再將變量寫入主內(nèi)存,工作內(nèi)存是線程的私有區(qū)域
JMM中的主內(nèi)存
?存儲Java實例對象
?包括成員變量、類信息、常量、靜態(tài)變量等
?屬于數(shù)據(jù)共享的區(qū)域,多線程并發(fā)操作時會引|發(fā)線程安全問題
JMM與Java內(nèi)存區(qū)域劃分是不同的概念層次
?JMM描述的是一組規(guī)則,圍繞原子性,有序性、可見性展開
?相似點:存在共享區(qū)域和私有區(qū)域
主內(nèi)存與工作內(nèi)存的數(shù)據(jù)存儲類型以及操作方式歸納
?方法里的基本數(shù)據(jù)類型本地變量將直接存儲在工作內(nèi)存的棧幀結(jié)構(gòu)中
?引用類型的本地變量:引用存儲在工作內(nèi)存中,實例存儲在主內(nèi)存中
?成員變量、static變量、 類信息均會被存儲在主內(nèi)存中
?主內(nèi)存共享的方式是線程各拷貝- -份數(shù)據(jù)到工作內(nèi)存,操作完成
后刷新回主內(nèi)存