- 定义
程序中各个变量的访问规则,在虚拟机中将变量存储到内存和从内存取出变量这样的底层细节。
- 主内存与工作内存
主内存:所有的变量都存在主内存中(虚拟机内存的一部分)
工作内存:每条线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。
- 内存间的交互
虚拟机实现时必须保证下面提及的每一种操作都是原子的,不可再分的
- lock:作用于主内存的变量,它把一个变量标识为一条线程独占的状态
- unlock:作用于主内存的变量,它把一个处于锁定状态的变量释放出来
- read:作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中
- load:作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
- use:作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作
- assign:作用于工作内存变量,它把一个从执行引擎变量收到的值赋给工作内存的变量,每当虚拟机遇到一个需要给变量复制的字节码指令时将会执行这个操作
- store:作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,供随后的 write 使用
- write: 作用于主内存的变量,它把store 操作从工作内存中得到的变量的值放入主内存的变量中。
- volitale 变量
- 保证此变量对所有线程的可见性,也就是说,当一条线程修改了这个变量的值,新值对其他线程都是可以立即得知的
- 禁止指令重排序优化
- 原子性,可见性与有序性
原子性:基本数据类型的访问读写是具备原子性的
可见性:当一个线程修改了共享变量的值,其他线程能够立即得知这个修改
有序性:在本线程内观察,所有的操作都是有序的,如果在一个线程中观察另一个线程,所有的操作都是无序的
- 先行发生原则
发生在Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B观察到,影响包括修改了内存中共享变量的值,发送了信息,调用了方法等