本文暂不讲JMM(Java Memory Model)中的主存, 工作内存以及数据如何在其中流转等等,
这些本身还牵扯到硬件内存架构, 直接上手容易绕晕, 先从以下几个点探索JMM
原子性
有序性
可见性...指令3依赖于指令1, 2加载结果, 因此红色框选部分表示在等待指令1, 2结束.
待指令1, 2都已经走完MEM部分, 数据加载到内存后, 指令3继续执行计算EX....指令重排只可能发生在毫无关系的指令之间, 如果指令之间存在依赖关系, 则不会重排.
如 指令1 : a = 1 指令2: b = a - 1, 则指令1, 2 不会发生重排....两者区别在于当jvm运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器,
而-server模式启动的虚拟机采用相对重量级,代号为C2的编译器....例子2中是r2, r5值因为都是=r1.x, 编译器会使用向前替换, 把r5指向到r2, 最终可能导致r2=r5=0, r4 = 3;
?