1、JMM内存模型
1、基本概念
程序:代码,完成某一件任务,代码序列(静态的概念)
进程:程序在某些数据上的一次运行(动态的概念)
线程:一个进程可能包含一个或多个线程(占有资源的独立单元)
2、JVM与线程
JVM什么时候启动?类被调用 JVM线程—-》其他的线程(main)
线程在JVM中
3、JVM内存区域
方法区:类信息、常量、static 、JIT (信息共享)
Java堆区:实例对象 GC (信息共享) (OOM)
VM stack:Java方法在运行的内存模型 (OOM)
PC 程序计数器 : 保存下一行执行的指令,如果是native就清零,并且不会OOM
4、Java内存模型
Java memory model JMM(规范,抽象的模型)
Jvm是JMM规范的一个实现,Jmm的主内存实现为Jvm的主内存堆,工作空闲实现为Jvm的栈。
主内存中保存的是共享数据,栈中保存的是私有数据。
工作方式:
线程修改私有数据,直接在工作空间中修改。
线程修改共享数据,需要先复制一份到工作空间中修改然后写回主内存。
这样设计的原因是为了确保线程间的不可见性,防止脏读现象。
CPU的缓存一致性问题:
解决方案 :
1.加锁 bus
2.缓存一致性协议 MESI
加锁会带来效率问题。
缓存一致性协议: 当一个线程在cache中修改数据,如果这是数据是共享变量,那么会将cache line 设置成无效,此时别的线程就会感知到,不会再加载到缓存中工作,而是直接去内存中读取。
JMM内存模型的作用
规范内存和工作空间进行的数据交互
Jmm的三个特征
- 原子性
- 是一个独立的单元不可再分
- i = 10 有原子性
- i++ i— 没有原子性
- 通过synchronized和JUC的Lock类保证
- 是一个独立的单元不可再分
- 有序性
- volatile 不允许重排
- 程序中的顺序不一定是执行的顺序,编译重排,指令重排,为了提高程序效率
- synchronized 加锁的代码块不会被重排
- volatile 不允许重排
- 可见性
- 在Jmm中实现了MESI协议
- 给一个变量添加volatile关键字,让其他线程感知到,访问这个变量的时候就不会复制到工作空间中而是直接从主内存中获取。
- synchronized和Lock 也能让别的线程感知到锁的存在
- 在Jmm中实现了MESI协议