JAVA内存模型是JVM抽象出来的Java存储模型。JMM定义了java线程是如何使用内存的,以及线程是如何和内存进行交互的。对于研究Java并发,JMM是必须要了解的一个方面。

JMM的模型

Imgur

  1. Thread Stack线程栈:线程栈是线程私有的。存放一些基本数据类型以及对象的引用。
  2. Java堆:堆是由JVM动态分配的,对象的实例会存在Java堆中。存在堆上的对象可以被线程的栈中的引用所访问。
  3. 在图中,Object3可以同时被两个线程访问,实际上在访问时,线程访问的是对象的拷贝,每一个线程所访问的都是对于对象的私有拷贝。

线程间共享对象的模型

Imgur

  1. 假设线程A和线程B共同持有对于某个对象C的引用。
  2. 线程A获取C对象的拷贝,存入线程A的本地内存,并对C进行操作和修改。此时主内存中的C仍然是未被修改过的。
  3. 线程A将C重新写回主内存中。
  4. 线程B获取被更改后的C的复制,此时对象已经被更新。

同步操作的指令

Imgur

  • lock:作用于主内存的变量,它把一个变量标识为一条线成独占的状态。
  • unlock:作用于主内存的变量,把一个出于锁定状态的变量释放出来,释放后的变量才能被别的线程锁定。
  • read:作用于主内存的变量,将主内存中的变量传输到线程的工作内存中,以便随后load使用。
  • load:作用于工作内存的变量,将read从主内存中得到的变量放入工作内存的变量副本中。
  • use:作用于工作内存的变量,它把工作内存中的一个变量的值传递给执行操作,每当虚拟机需要用到变量的值的时候会执行这个操作。
  • assign:作用于工作内存的变量。当JVM需要对某个变量进行赋值时,将调用该指令对工作内存中的变量进行赋值。
  • store: 将工作内存的一个变量的值传到主内存,为了write做准备。
  • write:作用于主内存的变量,将store得到的变量的值写入。