并发基础-JVM内存模型

Java内存模型
启动进程,会启动jvm(调用虚拟机的命令),加载包含main方法的类,然后按需去加载其他类,启动其他线程。

java内存区域各自有各自的用途,以及创建和销毁时间,有些随着虚拟机的启动而存在,有些依赖用户线程的启动和结束而建立和销毁。

JMM java内存模型规范,用于指导和规范内存数据与工作空间数据的交互 。java内存区域是按照JMM规范来划分的。
并发基础-JVM内存模型
并发基础-JVM内存模型

1)主内存:共享的信息
2)工作内存:私有信息,基本数据类型,直接分配到工作内存,引用的地址存放在工作内存,引用的对象存放在堆中
3)工作方式:
A 线程修改私有数据,直接在工作空间修改
B 线程修改共享数据,把数据复制到工作空间中去,在工作空间中修改,修改完成以后,刷新内存中的数据

4)Java内存模型的必要性
Java内存模型的作用:规范内存数据和工作空间数据的交互

工作空间对应了native stack,VM stack, pc计数器
内存对应了方法去,堆;

下面是硬件架构
并发基础-JVM内存模型

缓存有一级缓存,二级缓存,三级缓存。依次容量越大,速度越慢。访问的顺序也是这个顺序
从物理内存的角度考虑,工作空间包含主存的部分,缓存和寄存器;而内存就是指主内存。

a)CPU缓存的一致性问题:并发处理的不同步
b)解决方案:
i.总线加锁(是给数据总线,控制总线还是地址总线加锁呢?) ,这种加锁的方式降低CPU的吞吐量
ii.缓存上的一致性协议(MESI)
当CPU在Cache中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据
Cache line置无效,其他的CPU就从内存中读数据。只要修改数据的线程将修改写入内存后,其他的线程在此之后读取的一定是更新后的数据,但是并不能保证立即写入主内存。

虚拟机栈描述的是Java方法执行的内存模型。

Java内存模型与硬件处理器之间的关系
并发基础-JVM内存模型

任务与线程一一对应

6、并发编程的三个重要特性
原子性:不可分割 x=1
可见性:线程只能操作自己工作空间中的数据,彼此的工作空间对其他线程不可见,只对自己可见。
有序性:程序中的顺序不一定就是执行的顺序

  1. 编译重排序
  2. 指令重排序
  3. 提高效率

7、JMM对三个特征的保证
1)JMM与原子性
A)X=10 写 原子性 如果是私有数据具有原子性,如果是共享数据没原子性(读写)
B)Y=x 没有原子性
a) 把数据X读到工作空间(原子性)
b) 把X的值写到Y(原子性)
C)I++ 没有原子性
a)读i到工作空间
b)+1;
c)刷新结果到内存
D)Z=z+1 没有原子性
a)读z到工作空间
b)+1;
c)刷新结果到内存
多个原子性的操作合并到一起没有原子性
保证方式:
Synchronized
JUC Lock的lock

2)JMM与可见性
Volatile:在JMM模型上实现MESI协议,只有修改线程将共享数据写入主内存后才会保证其他线程读取的是新数据。
Synchronized: 加锁
JUC Lock的lock方法

3)JMM与有序性
Volatile:volatile修饰的语句,不会参与指令重排,也不会参与编译重排。
Synchronized:
Happens-before原则:
1)程序次序原则:执行结果不变
2)锁定原则 :后一次加锁必须等前一次解锁
3)Volatile原则:霸道原则
4)传递原则:A—B —C A–C

总结:
JVM内存区域和JMM的关系
JMM和硬件的关系
JMM和并发编程三个重要特征(有序性 as-if-seria happens-before)