1.主內(nèi)存和工作內(nèi)存
Java內(nèi)存模型的主要目標(biāo)是定義程序中各個變量的訪問規(guī)則,即在虛擬機(jī)中將變量儲存到內(nèi)存和從內(nèi)存中取出變量這樣的底層細(xì)節(jié)。此處的變量與Java編程中所說的變量有所區(qū)別,它包括了實例字段、靜態(tài)字段和構(gòu)成數(shù)組對象的元素,但不包括局部變量和方法參數(shù) ,因為它們是線程私有的,不會被共享,自然也不會有競爭問題存在,為了獲得較好的執(zhí)行性能,Java內(nèi)存模型并沒有限制執(zhí)行引擎使用處理器的特定寄存器或者緩存來和主內(nèi)存進(jìn)行交互,也沒有限制即時編譯器進(jìn)行調(diào)整代碼執(zhí)行順序這類優(yōu)化措施。

線程、主內(nèi)存、工作內(nèi)存三者之間的交互關(guān)系
Java內(nèi)存模型規(guī)定了所有變量都存儲在主內(nèi)存中(此處的主內(nèi)存與介紹物理硬件時的主內(nèi)存名字一樣,兩者也可以相互類比,但此處只是虛擬機(jī)內(nèi)存的一部分。)每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了該線程使用的變量的主內(nèi)存的副本拷貝,線程對變量的所有操作(讀取、賦值)都必須在工作內(nèi)存中進(jìn)行,而不能直接讀取主內(nèi)存的變量,不同線程之間無法直接訪問對方工作內(nèi)存中的變量,線程變量值的傳遞都需要通過主內(nèi)存來完成。