学Java多线程必知的Java内存模型JMM
JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、
JMM 体现在以下几个方面
- 原子性 - 保证指令不会受到线程上下文切换的影响
- 可见性 - 保证指令不会受 cpu 缓存的影响
- 有序性 - 保证指令不会受 cpu 指令并行优化的影响
我们熟知的valatile关键字就是确保了可见性与有序性,但注意,valatile不确保原子性
JVM与JMM
首先,不要把JVM内存模型与JMM内存模型搞混淆了
我们常说的JVM内存模式指的是JVM的内存分区,而Java内存模式是一种虚拟机规范
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果
JMM规范了Java虚拟机与计算机内存是如何协同工作的:
一个线程如何与何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量
Java内存模型跟CPU缓存模型类似,是基于CPU缓存模型来建立的,Java内存模型是标准化的,屏蔽掉了底层不同计算机的区别,在任何计算机上,JMM都可以抽象成线程与内存
首先我们得看看Java内存模型是基于底层怎样的机