文章目录
Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。
一、内存屏障
在CPU中,每个CPU又有多级缓存,一般分为L1,L2,L3。
CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找,每个cpu有且只有一套自己的缓存。
因为这些缓存,提高了数据访问性能,避免每次都向主内存索取,但是弊端也很明显,不能实时的和内存发生信息交换,涉及到一个缓存一致性的问题,而且由于操作系统可能存在重排序,导致读取到错误的数据,因此,操作系统提供了一些内存屏障以解决这种问题.
不同硬件对内存屏障的实现方式不一样,java屏蔽掉这些差异,通过jvm生成内存屏障
1. 内存屏障的作用
cpu执行指令可能是无序的,它有两个比较重要的作用
- 阻止屏障两侧指令重排序。
- 强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。
2. volatile关键字
volatile 保证了内存可见性并且禁止CPU指令重排序。
可见性:指线程之间的可见性,一个线程修改的状态对另一个线程是可见的,也就是一个线程修改的结果,另一个线程马上就能看到。
指令重排序: JVM为了优化指令、提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度;指令重排序包括编译器重排序和运行时重排序。
注意:volatile不能保证数据的原子性。
举个