Java的内存模型分为主内存,和工作内存。
主内存是所有的线程所共享的,工作内存是每个线程自己有一个,不是共享的。
线程工作时将要用到的变量从主内存拷贝到自己的工作内存,然后在工作内存中进行读和写。
写完之后,可能没被更新到主内存去。导致其他线程从主内存拷贝数据到自己的工作区时,拷贝的不是最新的数据。这就是内存可见性问题。
那么问题来了,Java的工作内存是什么??
百度 "java多线的工作内存是什么“,看了很多博客都说是各种缓存。
但是缓存不是大家都能访问的吗?
认证高级PHP讲师
这里缓存的定义太泛容易引起歧义。lz看这个就可以了
Java 虚拟机规范定义了 Java 内存模型来屏蔽掉各种硬件和操作系统的内存差异,达到跨平台的内存访问效果。
为了获得更好的执行性能,Java 内存模型没有限制执行引擎使用处理器的特定缓存器或缓存来和主内存(可以和 RAM类比,但是是虚拟机内存的一部分)交互,工作内存(可类比高速缓存,也是虚拟机内存的一部分)为线程私有。
工作内存和主内存的划分和 Java 堆,栈,方法区的划分不同,两者基本没有关系,如果勉强对应,则主内存可理 解为堆中实例数据部分,工作内存则对应栈中部分区域
-----引用<<深入理解 JAVA 虚拟机>>
一个线程会有一个线程栈,一个方法调用就是一个栈帧。一个栈帧又分为:局部变量区、操作数栈和帧数据区。你可以理解 工作内存为局部变量区中的数据。
@wlingxiao 说的在《深入理解JAVA虚拟机》,第二版,12.3.1 主内存与工作内存
这里缓存的定义太泛容易引起歧义。lz看这个就可以了
Java 虚拟机规范定义了 Java 内存模型来屏蔽掉各种硬件和操作系统的内存差异,达到跨平台的内存访问效果。
为了获得更好的执行性能,Java 内存模型没有限制执行引擎使用处理器的特定缓存器或缓存来和主内存(可以和 RAM类比,但是是虚拟机内存的一部分)交互,工作内存(可类比高速缓存,也是虚拟机内存的一部分)为线程私有。
工作内存和主内存的划分和 Java 堆,栈,方法区的划分不同,两者基本没有关系,如果勉强对应,则主内存可理 解为堆中实例数据部分,工作内存则对应栈中部分区域
-----引用<<深入理解 JAVA 虚拟机>>
一个线程会有一个线程栈,一个方法调用就是一个栈帧。一个栈帧又分为:局部变量区、操作数栈和帧数据区。
你可以理解 工作内存为局部变量区中的数据。
@wlingxiao 说的在《深入理解JAVA虚拟机》,第二版,12.3.1 主内存与工作内存