Java内存模型-JMM

发布时间 2023-10-13 11:54:38作者: 之士咖啡

内存模型与内存区域

 很多时候,二者会混淆,所以咱们先做区分:内存模型与内存区域

  • 内存区域是指JVM运行时将数据分区域存储,强调的是对空间的分配
  • 内存模型(JMM)是定义了线程和主内存之间的抽象关系。即定义了 JVM 在计算机内存中的工作方式

内存模型

抽象关系定义

  • 线程之间的共享区间为主内存,也就是硬件中
  • 每个线程都有个属于自己的本地内存,用于存储线程变化过程中的值。本地内存是JMM的一个抽象概念,并不真实存在
  • 取值过程:线程 <---> 工作内存 <---> 寄存器和高速缓存 <---> 主内存。寄存器和高速缓存的作用在于加快读的速度
  • JVM的静态内存储模型(JVM内存模型)只是一种对内存的物理划分而已,它只局限在内存,而且只局限在JVM的内存

内存模型结构图

  图解:由于JMM的存在,让线程有本地内存(工作内存)的定义。同时也定义了,数据的访问方式。
image

volatile

  volatile 是基于JMM下的一个产物。基于JMM下线程之间相互独立,互不干涉,以至于相互通讯变得困难,故诞生了 volatile。
private volatile String COM_STR = new String() ;

死记volatile的特性:

  • 可见性
  • 有序性,禁止指令重排序(happen-before原则)
  • 不能保证原子性

理解volatile 的特性的一个好方法,是将volatile看成使用互斥锁。对其进行的读、写操作属于同步操作
锁的特性是可以做到临界区内保持原子操作。而Happens-before 规则也使得操作之间存在可见性。

使用 volatile后内存数据共享方式(嗅探是关键)

image