JMM模型以及八种内存交互操作

简单记录一下JMM模型以及相关交互操作

JMM模型概述

Java内存模型规定所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本的拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

主内存:主要对应Java堆中的对象实例数据部分。(寄存器,高速缓存)

工作内存:对应于虚拟机栈中的部分区域。(硬件的内存)

整个Java内存模型实际上是围绕以下三个特征建立,分别是:原子性,可见性,有序性

八种内存交互操作

JMM模型以及八种内存交互操作_第1张图片
  1. lock(锁定),作用于主内存中的变量,把变量标识为线程独占的状态。

  1. read(读取),作用于主内存的变量,把变量的值从主内存传输到线程的工作内存中,以便下一步的load操作使用。

  1. load(加载),作用于工作内存的变量,把read操作主存的变量放入到工作内存的变量副本中。

  1. use(使用),作用于工作内存的变量,把工作内存中的变量传输到执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。

  1. assign(赋值),作用于工作内存的变量,它把一个从执行引擎中接受到的值赋值给工作内存的变量副本中,每当虚拟机遇到一个给变量赋值的字节码指令时将会执行这个操作。

  1. store(存储),作用于工作内存的变量,它把一个从工作内存中一个变量的值传送到主内存中,以便后续的write使用。

  1. write(写入):作用于主内存中的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

  1. unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。

JMM对8种内存交互操作制定的规则:

  1. 不允许read、load、store、write操作之一单独出现,也就是read操作后必须load,store操作后必须write。

  1. 不允许线程丢弃他最近的assign操作,即工作内存中的变量数据改变了之后,必须告知主存。

  1. 不允许线程将没有assign的数据从工作内存同步到主内存。

  1. 一个新的变量必须在主内存中诞生,不允许工作内存直接使用一个未被初始化的变量。就是对变量实施use、store操作之前,必须经过load和assign操作。

  1. 一个变量同一时间只能有一个线程对其进行lock操作。多次lock之后,必须执行相同次数unlock才可以解锁。

  1. 如果对一个变量进行lock操作,会清空所有工作内存中此变量的值。在执行引擎使用这个变量前,必须重新load或assign操作初始化变量的值。

  1. 如果一个变量没有被lock,就不能对其进行unlock操作。也不能unlock一个被其他线程锁住的变量。

  1. 一个线程对一个变量进行unlock操作之前,必须先把此变量同步回主内存。

你可能感兴趣的:(Java基础,java,jvm)