一、背景
《Java虚拟机规范》尝试定义一种Java内存模型(Java Memory Model)来屏蔽各种硬件和操作系统访问内存的差异,在不同平台访问内存方式一致。
二、内存模型
Java内存模型就是定义访问各种变量的规则,也就是说关注Java虚拟机想内存存储变量和从内存读取变量的细节。
1. 主内存和工作内存
Java内存模型规定所有的变量存储在主内存中(Main Memory)(这里的主内存不是物理上的内存,Java内存模型指的主内存是Java虚拟机内存的一部分,可以类比成物理内存),线程有自己的工作内存(Working Memory)(工作内存可以类比为高速缓存),线程的工作内存存储了该线程使用变量的主内存的副本,线程对变量的所有操作(读取、赋值)都是在工作内存进行的。线程是不如许直接读取主内存变量数据的。
线程的工作内存是线程私有的,不同线程间是不能访问对方线程工作内存的变量的。线程之间的变量数据传递是通过主内存完成的。不同线程读写主内存变量数据涉及到线程安全问题。
2. 内存间交互协议
内存间交互是指主内存和工作内存间的交互,即变量在主内存的值拷贝到工作内存,再将变量的值从工作内存同步到回内存变量上的过程。Java虚拟机通过一下步骤完成内存交互,并且Java虚拟机保证以下操作都是原子的、不可再分的。
- lock(锁定):作用于主内存的变量,它将主内存变量标识为被一条线程锁定状态。
- unlock(解锁):作用于主内存的变量,它将被一条线程锁定状态的主内存变量释放出来,释放出来的主内存变量才能被其他线程锁定。
- read(读取):作用于主内存的变量,它将主内存变量的值传输到工作内存中,以便后续的load操作。
- load(载入):作用于工作内存的变量,它将主内存read的变量的值放入到工作内存的变量中。
- use(使用):作用于工作内存的变量,它将工作内存变量的值传递给Java虚拟机的执行引擎,每当执行引擎遇到使用工作内存的变量的字节码指令时执行此操作。
- assign(赋值):作用于工作内存的变量,它从执行引擎中接受的值赋值给工作内存的变量上,每当执行引擎遇到将值赋值给工作内存的变量的字节码指令时执行此操作。
- store(存储):作用于工作内存的变量,它将工作内存变量的值传送给主内存中,以便后续的write操作。
- write(写入):作用于主内存的变量,它将工作内存store的变量的值放入到主内存的变量上。