首先要注意Java内存模型与Java运行时数据区域的区别:
java内存模型:是一套Java虚拟机规范,是为了屏蔽掉各种硬件和操作系统的内存访问差异,可以让Java程序在各种平台都能达到一致的并发效果。
java运行时数据区域:java虚拟机在执行java程序时会把虚拟机所管理的内存区域,划分为若干区域,包括:程序计数器(寄存器),虚拟机栈,本地方法栈,方法区,堆
Java内存模型:
Java内存模型主要目标是定义程序中各个变量访问规则,即在虚拟机中,将变量存储到内存和从内存中取出变量这样的底层细节。此处变量指的是:实例字段、静态字段、构成数组对象的元素。不包括线程私有的局部变量和方法参数。
Java内存模型规定:java虚拟机内存分主内存和工作内存。所有变量都存储在注内存中,每个线程都拥有自己的工作内存。线程的工作内存中保存了局部变量,方法参数和被该线程使用到的变量的主内存副本拷贝。
Java内存模型和Java运行时数据区域不是同一个层次的概念划分。Java内存模型中的主内存对应于java堆中对象实例数据部分,工作内存对应于虚拟机栈中的部分区域。
内存之前的交互操作有:lock, read, load, use, assign, store, write, unlock
Lock:把一个变量标识为一条线程独占的状态
Read:把一个变量的值从主内存传输到线程的工作内存中
Load:把read操作中从主内存中得到的变量值放入工作内存的变量副本中
Use:把工作内存中一个变量副本的值传递为执行引擎
Assign:把一个从执行引擎接收到的值赋值给工作内存中的变量副本
Store:把一个工作内存中变量副本的值传送到主内存中
Write:把store操作从工作内存中得到的值放入主内存的变量中
Unlock:把一个处于锁定状态的变量释放出来,释放后的变量才能被其他线程锁定
其中作用于主内存的操作:lock,read,write,unlock
作用于工作内存的操作:load,use,assign,store
Java内存模型的这8个操作都是原子的,但是double和long型数据可能有例外,对于64位的数据类型,Java内存模型允许将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行。
Java运行时数据区域:
参看:java内存运行时数据区域 https://blog.csdn.net/qq_26881739/article/details/81031759