一、JMM--cpu有自己的缓存造成可见性问题
jmm重点强调cpu也有自己的告诉缓存,会造成可见性问题
二、指令重排--造成有序性问题
在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。从Java源代码到最终实际执行的指令序列,会经历下面3种重排序:
- 编译器优化的重排序:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
- cpu指令级并行的重排序:在指令级别,让没有依赖关系的多条指令并行。
- cpu内存重排:CPU有自己的缓存,指令的执行顺序和写入主内存的顺序不完全一致。例如Store Buffer的延迟写入。
在三种重排序中,cpu内存重排是造成“内存可见性”问题的主因。