JMM
Java内存结构
- Native method stack , 线程私有
- PC,线程私有
- 方法区,永久代,–(存放,类信息,常量,static,JIT)(信息共享,由于他需要被所有线程读取类信息等),OOM
- VM stack,线程私有,(当运行时栈内存超出设定的栈大小发生OOM)
- 堆(信息共享,需要被所有线程访问变量)(OOM)
Java内存模型 JMM
用于指导java运行的规范
硬件架构:
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的原子性:多个原子性的操作合并后,就不具原子性
* 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 前执行