Java的内存模型分为主内存,和工作内存。
主内存是所有的线程所共享的,工作内存是每个线程自己有一个,不是共享的。
线程工作时将要用到的变量从主内存拷贝到自己的工作内存,然后在工作内存中进行读和写。
写完之后,可能没被更新到主内存去。导致其他线程从主内存拷贝数据到自己的工作区时,拷贝的不是最新的数据。这就是内存可见性问题。
那么问题来了,Java的工作内存是什么??
百度 "java多线的工作内存是什么“,看了很多博客都说是各种缓存。
但是缓存不是大家都能访问的吗?
认证高级PHP讲师
這裡快取的定義太泛容易引起歧義。 lz看這個就可以了
Java 虛擬機器規格定義了 Java 記憶體模型來屏蔽掉各種硬體和作業系統的記憶體差異,達到跨平台的記憶體存取效果。
為了獲得更好的執行性能,Java 內存模型沒有限制執行引擎使用處理器的特定緩存器或緩存來和主內存(可以和RAM類比,但是是虛擬機內存的一部分)交互,工作內存(可類比高速緩存,也是虛擬機器記憶體的一部分)為線程私有。
工作記憶體和主記憶體的分割和Java 堆,棧,方法區的劃分不同,兩者基本上沒有關係,如果勉強對應,則主記憶體可理解為堆中實例資料部分,工作記憶體則對應棧中部分區域
-----引用>
一個執行緒會有一個執行緒棧,一個方法呼叫就是一個堆疊幀。一個棧幀又分為:局部變數區、操作數棧和幀資料區。 你可以理解 工作記憶體為局部變數區中的資料。
@wlingxiao 所說的在《深入理解JAVA虛擬機》,第二版,12.3.1 主記憶體與工作記憶體
這裡快取的定義太泛容易引起歧義。 lz看這個就可以了
Java 虛擬機器規格定義了 Java 記憶體模型來屏蔽掉各種硬體和作業系統的記憶體差異,達到跨平台的記憶體存取效果。
為了獲得更好的執行性能,Java 內存模型沒有限制執行引擎使用處理器的特定緩存器或緩存來和主內存(可以和RAM類比,但是是虛擬機內存的一部分)交互,工作內存(可類比高速緩存,也是虛擬機器記憶體的一部分)為線程私有。
工作記憶體和主記憶體的分割和Java 堆,棧,方法區的劃分不同,兩者基本上沒有關係,如果勉強對應,則主記憶體可理解為堆中實例資料部分,工作記憶體則對應棧中部分區域
-----引用>
一個執行緒會有一個執行緒棧,一個方法呼叫就是一個堆疊幀。一個棧幀又分為:局部變數區、操作數棧和幀資料區。
你可以理解 工作記憶體為局部變數區中的資料。
@wlingxiao 所說的在《深入理解JAVA虛擬機》,第二版,12.3.1 主記憶體與工作記憶體