12.1 Java内存模型
Java内存模型(Java Memory Model)是Java虚拟机规范中定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果
12.1.1 主内存与工作内存
- JMM的主要目标是定义程序中各种变量的访问规则
- JMM规定所有的变量都存放在主内存中(虚拟机内存的一部分)
- 每条线程有自己的工作内存,其中保存了被该线程用到的变量的主内存副本拷贝(注意:拷贝的并不是整个对象,而是对象中被用到的字段、该对象的引用等)
- 线程对变量的所有操作都必须在自己的工作内存中,不能直接操作内存中的变量。线程间变量值的传递也必须通过主内存来完成
此处的变量包括实例字段、静态字段和构成数组对象的元素,不包括局部变量和方法参数(形参),因为后者是线程私有的,不会被共享。
主内存和工作内存与java堆、栈等是不同层次的内存划分,所以两者之间没有关系。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EwsWdDne-1582538817788)(D:\PersonalNote\JVM\images\工作内存、内存之间的交互关系.png)]
12.1.2 内存间交互操作
关于工作内存与主内存的交互协议,虚拟机定义了8种操作,虚拟机实现时必须保证每一种操作都是原子的、不可再分的: