本文暂不讲JMM(Java Memory Model)中的主存, 工作内存以及数据如何在其中流转等等,
这些本身还牵扯到硬件内存架构, 直接上手容易绕晕, 先从以下几个点探索JMM
原子性
有序性
可见性...指令重排
指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序....举个例子 A = B + C, 需要如下指令
指令1 : 加载B到寄存器R1中
指令2 : 加载C到寄存器R2中
指令3 : 将R1与R2相加, 得到R3
指令4 : 将R3赋值给A
注意下图红色框选部分...指令3依赖于指令1, 2加载结果, 因此红色框选部分表示在等待指令1, 2结束.
待指令1, 2都已经走完MEM部分, 数据加载到内存后, 指令3继续执行计算EX....指令重排只可能发生在毫无关系的指令之间, 如果指令之间存在依赖关系, 则不会重排.
如 指令1 : a = 1 指令2: b = a - 1, 则指令1, 2 不会发生重排.