JVM-内存模型
Java内存模型 JMM:定义变量(字段实例,静态字段,不包括局部变量与方法参数,因为是线程私有的)的访问规则
1,主内存与工作内存
主内存
线程工作内存,变量副本
线程间变量传递,通过主内存传递
2,主内存和工作内存交互操作
交互协议:8种操作,每种操作原子化,不可以细分
lock
unlock
#####################
read---load
store-write
#####################
use
assign
交互操作原则:8个规则
volatile的特性
可见性,不能保证原子性(所以并发下并非线程安全)
禁止指令重排序优化:内存屏障,指令重排序
volatile变量的特殊规则:read,load,use,assign,store,write的特殊规则
long和double的特殊规则:
64位的数据类型
非原子性协定
3,
原子性,基本类型数据操作为原子性的,更大范围的使用lock/unlock--->monitorenter/monitorexit--->synchronized关键字
可见性,变量修改后将新值同步会主内存,在变量读取前从主内存刷新变量值,共享主内存这种方式实现可见性
volatile变量的区别是新值能立即同步会主存,每次使用前立即从主存刷新,但是线程操作数栈中的变量不会立即刷新
有序性
线程内表现为串行语意
指令重排序
工作内存与主存同步延迟
volatile保证有序性:禁止指令重排序语意
synchronized保证有序性:一个变量在同一时刻只允许一个线程对其lock操作
4,先行发生原则(happens-before):8个
程序次序规则:同一线程,控制流顺序
管程锁定规则:同一个锁,unlock先于lock
volatile变量规则:同一个变量,写先于读
线程启动规则
线程终止规则
线程中断规则
对象终结规则
传递性: