Java@深入理解Java虚拟机:高效并发之Java内存模型


Java@深入理解Java虚拟机:高效并发之Java内存模型
文章图片
Java@深入理解Java虚拟机:高效并发之Java内存模型
文章图片
计算机系统并发执行

  1. 高速缓存(Cache):作为内存与处理器之间的缓冲;
  2. 将运算需要使用的数据复制到缓存中 , 让运算能快速进行 , 当运算结束后在冲缓存同步回内存之中 , 这样处理器就无须等待缓慢的内存读写了 。
  3. 缓存一致性(Cache Conherence)
  4. 当多处理器的运算任务都涉及同一块主内存区域时 , 需要各个处理器访问缓存时都遵循一定协议 , 在读写时要根据协议来进行操作(MSI、MESI、MOSI、Synapse、Firefly、Dragon Protocol) 。
  5. 为了使处理器内部的运算单元能尽量被充分利用 , 处理器可能会对输入代码进行乱序执行优化 , 处理器会在计算之后将乱序执行的结果重组 , 保证该结果与顺序执行的结果是一直的 , 但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一直 。

处理器、高速缓存、主内存间的交互关系
Java内存模型
  1. Java内存模型(Java Memory Model , JMM):来屏蔽各种硬件和操作系统的内存访问差异 , 以实现让Java程序在各种平台下都能达到一致的内存访问效果 。

线程、主内存、工作内存三者的交互关系
  1. 主内存:对应于Java堆中的对象实例数据部分 。
  2. 工作内存:对应于虚拟机栈中的部分区域 。
内存间交互操作主内存与工作内存之间具体的交互协议
  1. lock(锁定):作用于主内的变量 , 它把一个变量标识为一条线程独占的状态 。
  2. unlock(解锁):作用于主内存的变量 , 它把一个处于锁定状态的变量释放出来 , 释放后的变量才可以被其他线程锁定 。
  3. read(读取):作用于主内存的变量 , 它把一个变量的值从主内存传输到线程的工作内存中 , 以便随后的load动作使用 。
  4. load(载入):作用于工作内存的变量 , 它把read操作从主内存中得到的变量值放入工作内存的变量副本中 。
  5. use(使用):作用于工作内存的变量 , 它把工作内存中一个变量的值传递给执行引擎 , 每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作 。
  6. assign(赋值):作用于工作内存的变量 , 它把一个执行引擎接受到的值赋给工作内存的变量 , 每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作 。
  7. store(存储):作用于工作内存的变量 , 它把工作内存中一个变量的值传送到主内存中 , 以便随后的write操作使用 。
  8. write(写入):作用于主内存的变量 , 它把store操作从工作内存中得到的变量的值放入主内存的变量中 。
执行基本操作时满足的规则:
  1. 不允许read和load、store和write操作之一单独出现 , 即不允许一个变量从主内存读取了但工作内存不接受 , 或者工作内存发起回写了但主内存不接受的情况出现 。