1.什么是 JMM
JMM 全称是 Java Memory Model.
导致可见性问题的根本原因是缓存以及重排序。
JMM 实际上就是提供了合理的禁用缓存以及禁止重排序的方法。所以它最核心的价值在于解决可见性和有序性。
JMM 属于语言级别的抽象内存模型,可以简单理解为对硬件模型的抽象,它定义了共享内存中多线程程序读写操作
的行为规范:在虚拟机中把共享变量存储到内存以及从内存中取出共享变量的底层实现细节通过这些规则来规范对内存的读写操作从而保证指令的正确性,它解决了 CPU 多级缓存、处理器优化、指令重排序导致的内存访问问题,保证了并发场景下的可见性。
JMM 把底层的问题抽象到 JVM 层面,再基于 CPU 层面提供的内存屏障指令,以及限制编译器的重排序来解决并发问题。
2.JMM 抽象模型分为主内存、工作内存
主内存:是所有线程共享的,一般是实例对象、静态字段、数组对象等存储在堆内存中的变量。
工作内存:是每个线程独占的,线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存中的变量。
线程之间的共享变量值的传递都是基于主内存来完成。
Java 内存模型底层实现可以简单的认为:通过内存屏障(memory barrier)禁止重排序。
3.JMM 是如何解决可见性有序性问题的
JMM 提供了一些禁用缓存以及禁止重排序的方法,来解决可见性和有序性问题。
对程序提供的API关键字:volatile、synchronized、final;
4.JMM 如何解决顺序一致性问题
从源代码到最终执行的指令,