Java内存模型-JMM
内存模型与内存区域
很多时候,二者会混淆,所以咱们先做区分:内存模型与内存区域
- 内存区域是指
JVM运行时将数据分区域存储
,强调的是对空间的分配 - 内存模型(JMM)是定义了
线程和主内存之间的抽象关系
。即定义了 JVM 在计算机内存中的工作方式
内存模型
抽象关系定义
- 线程之间的共享区间为主内存,也就是硬件中
- 每个线程都有个属于自己的本地内存,用于存储线程变化过程中的值。本地内存是JMM的一个抽象概念,并不真实存在
- 取值过程:线程 <---> 工作内存 <---> 寄存器和高速缓存 <---> 主内存。
寄存器和高速缓存
的作用在于加快读的速度 - JVM的静态内存储模型(JVM内存模型)只是一种对内存的物理划分而已,它只局限在内存,而且只局限在JVM的内存
内存模型结构图
图解:由于JMM的存在,让线程有本地内存(工作内存)的定义。同时也定义了,数据的访问方式。
volatile
volatile
是基于JMM
下的一个产物。基于JMM下线程之间相互独立,互不干涉,以至于相互通讯变得困难,故诞生了 volatile。
private volatile String COM_STR = new String() ;
死记volatile
的特性:
- 可见性
- 有序性,禁止指令重排序(happen-before原则)
- 不能保证原子性
理解
volatile
的特性的一个好方法,是将volatile看成使用互斥锁。对其进行的读、写操作属于同步操作
锁的特性是可以做到临界区内保持原子操作。而Happens-before 规则也使得操作之间存在可见性。