# Introduce

JMM 全称 Java Memory Model。JMM 本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。Java 内存模型决定了一个线程对共享变量的何时对其他线程可见,Java 内存模型定义了线程和主存之间的抽象关系如下:

  • 共享变量存储于主存之中,每个线程都可以访问
  • 每个线程都有私有的工作内存(又称为本地内存)
  • 工作内存只存储该线程对共享变量的副本
  • 线程不能直接操作主内存,只有先操作了工作内存之后才能写入主内存
  • 工作内存和Java内存模型一样都是抽象的概念,并不真实存在。

上图中,假设主内存的共享变量为0。

此时线程1 和线程2 都分别有共享变量的副本。

当线程1修改了共享变量 = 1,此时主内存的共享变量会被刷新也=1.

当线程2想使用共享变量副本时,该变量会被失效,需要主动再去主内存中拿。此时共享变量副本=1

# Java内存模型与CPU硬件架构交互

Java 的内存模型是一个抽象的概念,其与计算机硬件的结构并不完全一样,比如计算机物理内存不会存在栈内存和堆内存的划分, 无论是堆内存还是栈内存都会对应到物理的主内存,当然也有一部分堆栈内存的数据可能会存入到 CPU Cache 寄存器中。

当同一个数据被分别存储到计算机的各个内存区域时,势必会导致多个线程在各自的工作区域中看到的数据可能不一致,这需要就需要保证不同线程对某个共享变量的可见性,Java 中的关键字 volatile 就能实现该效果。

精彩内容推送,请关注公众号!
最近更新时间: 4/16/2020, 9:21:16 PM