java内存模型
1 基本概念
程序:代码,完成某一件任务,代码序列(静态的概念)
进程:程序在某些数据上的一次运行(动态的概念)
线程:一个进程中包含一个或多个线程(占有资源的独立单元)
2 JVM与线程
jvm什么时候启动? 类被调用 JVM线程 --> 其他线程(main)
线程在jvm中
3 JVM内存区域 (按照JMM规范划分的最终的结果)
方法区: 类信息,常量,static,JIT(java即时编译) 反射去加载类 classload (信息共享)
堆区:实例对象 GC (信息共享) (OOM)内存溢出
虚拟机栈: java方法在运行时的内存模型 (OOM) 如下图
程序计数器: java线程的私有数据,执行下一条指令的地址
本地方法栈:虚拟机的native方法有关
4 Java内存模型 java memory model JMM(规范 抽象模型)
1) 主内存:共享的信息
2) 工作内存(工作空间): 私有信息 ,基本数据类型->直接分配到工作内存,引用类型->引用的地址存放在工作内存(工作空间),引用的对象存放在堆中(主内存)
3) 工作方式
A 线程修改私有数据,直接在工作空间修改
B 线程修改共享数据,把数据复制到工作空间中去,进行修改,刷新内存中的数据
这样设置的方式 是为了保证线程之间的不可见性。
5 硬件内存架构和 java内存模型
1)
a) CPU缓存一致性问题: 并发处理的不同步
b) 解决方案:
i. 总线加锁 (BUS) 将内存完全锁起来 一次只让一个cpu进行范围操作 降低cpu的吞吐量
ii. 缓存上的一致性协议 (MESI)
当cpu在Cache操作数据时,如果该数据是共享变量,数据在Cache中读到寄存器中,进行修改,并更新内存数据
Cache Line置成无效 ,其他的cpu就从内存中读数据
2)java线程与硬件处理器
3)java内存模型与硬件内存架构的关系
交叉: 数据的不一致
4)java内存模型的必要性
java内存模型的作用 : 规范内存数据和工作空间的数据的交互。
6 并发编程的三个重要特性
原子性 : 不可分割
可见性 : 线程只能操作自己工作空间中的数据
有序性 : 程序中的顺序不一定就是执行循序。 (当多行代码执行的顺序对结果没有影响的时候【无数据相关的时候】,会进行重排序)。 as-if-seria:在单线程中重排后不影响执行结果。 多线程 happens-before。
编译时重排序
指令重排序
提高效率。(操作指令的时间有关系)
7 JMM对三个特征的保证
1)JMM与原子性
A)x = 10 写操作 具有原子性。 如果是私有数据具有原子性,如果是共享数据就没有原子性。(共享数据需要先读后写)
B) y = x 没有原子性
把数据x读到工作空间(具有原子性)
把x的值写到y中去(具有原子性)
两个操作一起不具有原子性
C) i++ 没有原子性
读i到工作空间
+1
刷新结果到内存
D) Z = z + 1 没有原子性
多个原子性的操作合并到一起没有原子性。
保证方式 :
Synchronized (加锁)
JUC Lock的lock
2)JMM与可见性
Volatile (在JMM模型上实现了MESI协议) 执行较快
Synchronized :加锁 (执行较慢)
JUC Lock的lock 执行较慢)
3)JMM与有序性
Volatile
Synchronized
happens-before原则:
1) 程序次序原则 程序次序决定的结果不能改变
2) 锁定原则 : 后一次加锁 必须等待前一次解锁
3) Volatile原则 : 霸道原则 , 加了Volatile修饰的变量执行顺序不可变
4) 传递原则: A---B---C A---C
总结
JVM内存区域和JMM关系 : JVM利用JMM规范来进行实际内存区域的划分。JVM是java虚拟机实际内存的划分。
JMM和硬件的关系
JMM和并发编程三个重要特征。