JMM Java内存模型

一 硬件内存架构

JMM Java内存模型_第1张图片

CPU处理速度远大于内存处理速度,因此中间设置有高速缓存(cache,可以有多级)。这样会引发数据的一致性问题,即对于共享的数据而言,怎样保证各个CPU拿到的一致。

解决方案:

1. 总线加锁。优点:实现简单;缺点:降低CPU吞吐量。

2. 缓存一致性协议(MESI)

当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据

CACHE  LINE置无效,其他的CPU就从内存中读数据。

 

二 JMM

JMM Java内存模型_第2张图片

JMM,即JAVA内存模型,是一种规范,是一个概念。

JMM将内存分为两类:共享内存(主内存)和工作内存(工作空间)。

1. 共享内存:所有线程共享的内存空间。

2. 工作内存:线程私有的内存空间。

对于引用对象而言,引用的地址放在工作内存,引用的对象放在堆中。

3. 工作方式

  • 线程修改私有数据,直接在工作空间修改
  • 线程修改共享数据,把数据复制到工作空间中去,在工作空间中修改,修改完成以后,刷新内存中的数据

三 JMM与硬件内存的对应关系

JMM Java内存模型_第3张图片

四 JMM要保证的3个特性

原子性:不可分割

可见性:线程只能操作自己工作空间中的数据,对于共享数据,有线程修改了其值,如何保证其他线程可见。

有序性:程序中的顺序不一定就是执行的顺序:编译重排序、指令重排序(目的是 提高效率)

 

JMM如何保证原子性的方式: Synchronized;加锁,使用JUC(java.util.concurrent并发包)中的锁 lock。

JMM如何保证可见性的方式: Volatile;Synchronized;加锁,使用JUC(java.util.concurrent并发包)中的锁 lock。

JMM如何保证有序性: Volatile;Synchronized;Happens-before原则:

  1. 程序次序原则
  2. 锁定原则 :后一次加锁必须等前一次解锁
  3. Volatile原则:霸道原则
  4. 传递原则:A---B ---C    A--C

五 JVM内存区域与JMM

JVM内存区域是JVM使用内存区域的一种虚拟划分;JMM是一种规范,一种概念,面向的问题是原子性、可见性和有序性。

你可能感兴趣的:(Java)