JMM理解

JMM概念JMM(Java内存模型Java Memory Model , 简称JMM)本身是一种抽象的概念JMM(Java内存模型Java Memory Model , 简称JMM)本身是一种抽象的概念并不真实存在 , 它描述的一组规则或规范 , 通过这组规范定义了程序中各个变量(包括实例字段、静态字段何构成数组对象的元素)的访问方式 。
并不真实存在 , 它描述的一组规则或规范 , 通过这组规范定义了程序中各个变量(包括实例字段、静态字段何构成数组对象的元素)的访问方式 。
JMM关于同步的规定:
1、线程解锁前 , 必须把共享变量的值刷新回主内存
2、线程加锁前 , 必须读取主内存的最新值到自己的工作内存
3、加锁解锁是同一把锁
由于JVM运行程序的实体是线程 , 而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间) , 工作内存是每个线程的私有数据区域 , 而Java内存模型中的规定所有变量都存储在主内存 , 主内存是共享内存区域 , 所有线程都可以访问 , 但线程对变量的操作(读取赋值等)必须在工作内存中进行 , 首先要将变量从主内存拷贝到线程自己的工作内存空间 , 然后对变量进行操作 , 操作完成后再将变量写会主内存 , 不能直接操作主内存中的变量 , 各个线程中的工作内存中存储着主内存中的变量副本拷贝 , 因此不同的线程间无法访问对方的工作内存 , 线程间的通信(传值)必须通过主内存来完成 , 其简要访问过程入下图:
JMM理解文章插图
JMM 的八种内存交互操作为了更直观 , 先来看看这张图吧:
JMM理解文章插图

  1. lock(锁定):作用于主内存中的变量 , 一个变量在同一时间只能被一个线程锁定 , 即把变量标识为线程独占状态 。
  2. read(读取):作用于主内存变量 , 表示把一个变量值从主内存传输到线程的工作内存中 , 以便下一步的 load 操作使用 。
  3. load(载入):作用于线程的工作内存的变量 , 表示把 read 操作从主内存中读取的变量值放到工作内存的变量副本中(副本是相对于主内存的变量而言的) 。
  4. use(使用):作用于线程的工作内存中的变量 , 表示把工作内存中的一个变量值传递给执行引擎 , 每当虚拟机遇到一个需要使用变量的值的字节码指令时就会执行该操作 。
  5. assign(赋值):作用于线程的工作内存的变量 , 表示把执行引擎返回的值赋值给工作内存中的变量 , 每当虚拟机遇到一个给变量赋值的字节码指令时就会执行该操作 。
  6. store(存储):作用于线程的工作内存中的变量 , 把工作内存中的一个变量的值传递给主内存 , 以便下一步的 write 操作使用 。
  7. write(写入):作用于主内存的变量 , 表示把 store 操作从工作内存中得到的变量的值放入主内存的变量中 。
  8. unlock(解锁):作用于主内存的变量 , 表示把一个处于锁定状态的变量释放出来 , 释放后的变量才可以被其他线程锁定 。
JMM 还规定了以上八种操作需按照如下规则进行: