本文暂不讲JMM(Java Memory Model)中的主存, 工作内存以及数据如何在其中流转等等,
这些本身还牵扯到硬件内存架构, 直接上手容易绕晕, 先从以下几个点探索JMM
原子性
有序性
可见性...硬件优化(如写吸收,批操作)
cpu2修改了变量T, 而cpu1却从高速缓存cache中读取了之前T的副本, 导致数据不一致.
?
编译器优化
主要是Java虚拟机层面的可见性, 下文会有详细讲述....指令重排
指令重排是指在程序执行过程中, 为了性能考虑, 编译器和CPU可能会对指令重新排序....举个例子 A = B + C, 需要如下指令
指令1 : 加载B到寄存器R1中
指令2 : 加载C到寄存器R2中
指令3 : 将R1与R2相加, 得到R3
指令4 : 将R3赋值给A
注意下图红色框选部分...再来看两个从Java语言规范中摘取的例子, 也是涉及到编译器优化重排, 这里不再做详细解释, 只说下结果.
例子1中有可能出现r2 = 2 并且 r1 = 1;
?