Java内存模型

Java内存模型(JMM)抽象了线程和主内存之间的关系,就比如说线程之间的共享变量必须存储在主内存中。

在 JDK1.2 之前,Java 的内存模型实现总是从 主存 (即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存 本地内存 (比如机器的寄存器)中,而不是直接在主存中进行读写。

这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。

JMM
  • 主内存:所有线程创建的实例对象都存放在主内存中,无论该实例对象是成员变量还是方法中的局部变量。
  • 本地内存:每个线程都有一个私有的本地内存来存放共享变量的副本,并且只能访问自己的本地内存。

线程之间若想进行通信,则必须:

  • 线程A把本地内存中修改过的共享变量副本的值同步到主内存中;
  • 线程B到主内存中去读取相应的共享变量