1.主内存和工作内存
Java内存模型的主要目的是定义程序中各种变量的访问规则,及如何在虚拟机中把变量值存储到内存和从内存中读取变量值。这里所指的变量包括实例字段、静态字段、构成数组对象的元素,但是不包括局部变量和方法参数,因为局部变量和方法参数为线程私有,不会被共享,所以不存在竞争问题。
Java内存模型定义所有变量都存在主内存(Main Memory)中,此内存仅仅是虚拟机内存的一部分。每个线程有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用的变量的主内存副本。线程对变量的所有操作(读取/赋值)都必须在工作内存中完成,不能直接读写主内存中的数据。不同线程之间也无法直接访问其他线程的工作内存中的变量,线程间变量值的传递需要通过主内存来完成。
2.内存间的交互操作
Java内存模型定义了八种操作来完成变量从主内存拷贝到工作内存以及从工作内存同步回主内存。
lock(锁定)
作用于主内存变量,把一个变量标记为线程独占状态。unlock(解锁)
作用于主内存变量,把一个变量从线程独占状态解锁释放出来,释放后变量才能被其他线程锁定。
-read(读取))
作用于主内存变量,把变量值从主内存传输到线程到工作内存中,为线程的load操作做准备。
-load(载入))
作用于工作内存变量,把read从主内存中得到的变量值放入工作内存的变量副本中。use(使用))
作用于工作内存变量,把变量值传递给执行引擎,当虚拟机需要使用到变量值时执行。assign(赋值))
作用于工作内存变量,把从执行引擎接收的值赋值给工作内存变量,当虚拟机遇到变量赋值指令时执行。store(存储))
作用于工作内存变量,把工作内存中变量的值传递回主内存,为write做准备。write(写入))
作用于主内存变量,把从工作内存中得到的变量值写回主内存的变量中。
把变量从主内存拷贝到工作内存需要严格按照顺序:read -> load;
把变量从工作内存同步回主内存需要严格按照顺序:store -> write;
上述两组操作只要求按照顺序执行,但是不要求连续执行(即:read和load之间、store和write之间可以插入其他的指令)。