JMM

Java内存结构

  1. Native method stack , 线程私有
  2. PC,线程私有
  3. 方法区,永久代,–(存放,类信息,常量,static,JIT)(信息共享,由于他需要被所有线程读取类信息等),OOM
  4. VM stack,线程私有,(当运行时栈内存超出设定的栈大小发生OOM)
  5. 堆(信息共享,需要被所有线程访问变量)(OOM)

Java内存模型 JMM

用于指导java运行的规范
JMM
JMM
硬件架构:
JMM
CPU缓存一致性问题:
解决方案:
1. 总线加锁 --<总线包括 数据总线 控制总线 等>(BUS ),会降低CPU吞吐量
2. 缓存一致性协议 ,MESI(intel),当CPU在cache中操作数据时,如果该数据是共享变量,数据在cache中读取到寄存器进行修改并更新内存,cache line置无效,其他CPU就从内存中读数据
3. Java内存模型的必要性:规范内存数据和工作空间的交互
4. - 并发编程的3个特征:
* 原子性(要么同时成功要么同时失败,不可分割)、
* 可见性(线程只能操作自己的工作空间数据)、
* 有序性(程序的顺序不一定就是执行顺序,-- 存在编译重排序和CPU指令重排序(和指令操作时间有关)),
+ 重排遵循as-if-seria:在单线程中,重排不影响执行结果。happens-before:在多线程中遵循的重排规则
JMM

JMM对三个特征的保证

  • JMM的原子性:多个原子性的操作合并后,就不具原子性
    * x = 1 具有写原子性:如果是私有数据,那么具有原子性。如果是共享数据,需要将 x 读取到工作空间,再写,就没有原子性
    * y = x 不具有原子性,因为首先要把 x 读取到工作空间(具有原子性),再把 x 值写到 y(具有原子性),但将两个指令合并就不具有原子性
    * i++ 不具有原子性, 1.首先将i读取到工作空间 2. 进行+1 3.刷新到内存, 三个指令合并就不具有原子性
    * z = z+1 不具有原子性

  • 将不具原子性的指令具有原子性的方法:

    • Synchronized
    • Lock
  • JMM的可见性

    • volatile:在JMM上实现MESI协议
    • Synchronized:加锁
    • JUC Lock:
  • Happens-before原则
    * 程序次序原则:
    * 锁定原则:后一次加锁必须等待上一次解锁
    * volatile原则:声明后,禁止指令重排
    * 传递原则:A–B--C 那么 A 必须在 C 前执行