对于程序员
JMM给程序员呈现出来的是具有顺序一致性的强内存模型。(通俗点就是所见即所得)对于处理器与编译器
JMM给处理器与编译器提供了一个比较弱的happens-before内存模型,这样尽可能多的给处理器与编译器优化代码的空间。编译器优化的重排序。
编译器在不改变单线程程序语义的前提下,可以对我们编写的代码进行重排。如下: public class Test { public static void main(String args []) { int a = 1; // 1 int b = 2; // 2 // 在单线程语义下这个程序的输出为 1 // 交换标注为 1,2 的两行代码不改变单线程程序语义 // 编译器可以对这样的代码进行指令重排,以提高程序运行的性能 System.out.println(a); } } public class Test { public static void main(String args[ ]) { int a = 0; // 1 a = 2; // 2 a = 3; // 3 // 在单线程语义下这个程序的输出为3 // 如果标注为 2 ,3的代码进行交换顺序,那就改变了单线程语义,JMM // 是禁止这种重排序的。 System.out.println(a); } }2 . 处理器的指令级并行重排序
现代处理器采用了指令级并行技术,来对多条指令进行重排序。如果指令间不存在数据依赖(<u>对同一个变量写后读,读后写,写后写</u>),那处理器就可以改变指令间的执行顺序。如下: 0x00007f31c9108ac0: mov