JMM 即 Java Memory Model,它定义了**主存(共享内存)、工作内存(线程私有)**抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、 CPU 指令优化等。
JMM体现在以下几个方面
退出不出的循环
static Boolean run = true;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
while (run) {
//如果run为真,则一直执行
}
}).start();
Thread.sleep(1000);
System.out.println("改变run的值为false");
run = false;
}Copy
为什么无法退出该循环
可见性
有序性
多线程下的指令重排会影响安全性
可以使用double-checked locking模型实现单例
以上的实现优点是:
但在多线程的情况下,上面的代码有问题
JDK1.5以后的版本的voltile才会有效
happens-before规则
线程对volatile变量的写,对接下来其他线程对该变量的读可见
线程start前对变量的写,对该线程开始后对该变量的读可见
线程结束前对变量的写,对其他线程结束的读可见,