Java内存模型主要目标:
定义程序中各个变量的访问规则,即在虚拟机中存取内存中共享变量的方法。
1)所有变量存储在主内存(JVM内存的一部分)
2)每个线程有自己的工作内存,保存主内存中对应变量的副本,所有操作在工作内存中进行。
主内存可类比为JVM堆;工作内存可类比为JVM栈。
主内存和工作内存直接交互协议:
1)lock:把主内存中的一个变量设置为线程独占状态
2)unlock:解除主内存中的一个变量的线程独占状态,使得其他线程可以lock
3)read:把主内存中的一个变量传输到线程工作内存中,供load使用
4)load:把工作内存中的传输过来的变量值放到工作内存的变量副本中?
5)use:把工作内存中的一个变量值传给执行引擎
6)assign:把执行引擎接收的值存储到工作内存中的变量中
7)store:把工作内存中的值传输到主内存中,供write使用
8)write:把主内存中的一个变量存入主内存中的变量中
happens-before定义:
如果操作1的结果对操作2可见、且顺序在操作2之前,那么称操作1happens before操作2。
这并不是说操作1必须在操作2之前执行,而是说如果两个操作以不同的顺序执行(做了重排序),得出的效果无差别,检测不到两个操作乱序执行了。
单线程数据依赖性:
分析单线程中两条指令的顺序依赖性,判断是否可以重排序。有三种类型不能重排序:
1)写后读:a=1;b=a;
2)写后写:a=1;a=2;
3)读后写:a=b;b=1;
对于“读后读”这种指令,对于单线程来说可以任意重排序,而不影响单线程的执行结果。