JMM约定将内存划分为工作区和公共内存数据区域。工作区为线程私有,基本类型数据和对象引用的地址存储在工作区。当需要对内存区域的数据进行读写时复制到工作区,修改完成后刷新到内存区供其他线程使用。这其中可能会产生数据不一致性的问题,使用Volatile和synchronized以及锁等机制来保证。编码规则,需要注意原子性、可见性、有序性。 JVM是对于JMM约定的具体实现方法,将内存分为五个部分,方法区,堆,JVM栈,本地方法栈,程序计数器。前两者属于线程共有,后三者属于线程私有。方法区存储类、常量、JIT即时编译的方法代码,类加载信息的引用等等。堆存储对象。JVM栈主要由方法栈帧组成,栈帧包含方法内的局部变量,操作数栈、动态链接和出口地址。本地方法是JVM本身运行的方法和调用其他语言的区域。程序计数器记录线程执行的地址,方便线程切换。

##

JMM中规定内存交互操作有8种,每种操作都有自己作用的的区域,具体操作如下:

  1. lock(锁定):作用于主内存的变量,把一个变量标识为线程独占状态。
  2. unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
  3. read (读取):作用于主内存变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
  4. load(载入):作用于工作内存的变量,它把read操作从主存中变量放入工作内存中。
  5. use(使用):作用于工作内存中的变量,它把工作内存中的变量传输给执行引擎,每当虚拟机遇到一个需要使用到变量的值,就会使用到这个指令。
  6. assign(赋值):作用于工作内存中的变量,它把一个从执行引擎中接受到的值放入工作内存的变量副本中。
  7. store(存储):作用于主内存中的变量,它把一个从工作内存中一个变量的值传送到主内存中,以便后续的write使用。
  8. write(写入):作用于主内存中的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

Volatile 是Java是虚拟机提供的轻量级的同步机制

保证可见性 不保证原子性 禁止指令重新排列

1 可见性

2 原子性