一、概念
JMM是Java内存模型
为了屏蔽硬件和操作系统内存访问差异,jvm规定的统一的一套内存访问模型(主存(存线程共享数据)+工作内存(存线程私有及共享变量的拷贝))
二、主内存与工作内存

三、内存间交互操作
八个原子性的字节码指令(用于主存和工作内存数据的读取操作)
lock(锁定) : 作用于主内存的变量,它把一个变量标识为一条线程独占的状态
unlock(解锁) : 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可
以被其他线程锁定。
read(读取) : 作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随
后的load动作使用。变量从主存读取到中间内存
load(载入) : 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量
副本中。变量从中间内存读取到工作内存
use(使用) : 作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎。使用变量参与计算
assign(赋值) : 作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量。把值赋给变量
store(存储) : 作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便后续的
write操作使用。
write(写入) : 作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量
中。
四、Java内存模型三大特性
五、volatile
使用场景:
修饰变量,如果变量的操作本身是原子性的,就可以保证线程安全
作用:
1.保证此变量对所有线程的可见性
2.禁止指令重排序,建立内存屏障
as-if-serial原则:保证单个线程看自己有序
happens-before原则(先行发生原则):规定哪些指令先执行