1. 硬件的效率与一致性
我们通过让计算机并发执行多个运算任务来充分利用计算机处理器的资源。但是运算任务除了计算之外还要进行IO的内存交互。由于计算机的存储设备与运算速度有几个数量级的差距,所以计算机系统都加入一层读写速度可能接近处理器运算速度的高速缓存。
1.1 高速缓存
缓存一致性问题:
在多处理器系统中,每个处理器都有自己的高速缓存,他们又共享同一主内存。当多个处理器涉及同一块主内存,可能导致各自缓存的数据不一致。
解决方案:
各个处理器访问缓存时遵循一些协议,读写数据时根据协议进行操作。比如:MSI,MESI,MOSI等。
内存模型:在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。
1.2 乱序执行
为了充分利用处理器性能,除了高速缓存之外,处理器还可能对输入的代码进行乱序执行优化。
乱序执行:处理器在计算之后对乱序执行的结果重组,保证结果与顺序执行的结果一致,但不保证各个语句的执行顺序与代码顺序一致。
Java的即时编译器也有类似的指令重排序优化。
2. 主内存和工作内存
2.1 Java内存模型的目的
定义程序中各个变量的访问规则。即在虚拟机中将变量存储到内存和从内存中取出变量的底层细节。
此处的变量包括实例字段,静态字段和构成数组对象的元素,但是不包括局部变量和方法参数,因为它们是线程私有,不存在竞争问题。
2.2 内存中的变量
Java内存模型规定所有的变量存储在主内存中。
线程在工作内存中保存了使用到的主内存中变量的副本拷贝,
线程对变量的操作必须在工作内存中进行,不能直接读写主内存中的变量。
不同线程之间无法访问对方工作内存的变量。
2.3 线程,工作内存和主内存的交互关系
线程之间共享变量值的传递均需要通过主内存来完成。
这里所讲的主内存、工作内存与前面讲解Java内存区域中的Java堆、栈、方法区等不是同一个层次划分,两者无任何关系。
即:内存模型和内存结构是两个不同的概念。