本文暂不讲JMM(Java Memory Model)中的主存, 工作内存以及数据如何在其中流转等等,
这些本身还牵扯到硬件内存架构, 直接上手容易绕晕, 先从以下几个点探索JMM
原子性
有序性
可见性...而如i++, 则不是原子性的, 因为他实际上i = i + 1, 若存在多个线程操作i, 结果将不可预期.
?
有序性
有序性是指在单线程环境中, 程序是按序依次执行的....硬件优化(如写吸收,批操作)
cpu2修改了变量T, 而cpu1却从高速缓存cache中读取了之前T的副本, 导致数据不一致.
?
编译器优化
主要是Java虚拟机层面的可见性, 下文会有详细讲述....举个例子 A = B + C, 需要如下指令
指令1 : 加载B到寄存器R1中
指令2 : 加载C到寄存器R2中
指令3 : 将R1与R2相加, 得到R3
指令4 : 将R3赋值给A
注意下图红色框选部分...例子2中是r2, r5值因为都是=r1.x, 编译器会使用向前替换, 把r5指向到r2, 最终可能导致r2=r5=0, r4 = 3;
?