1.Java内存区域划分为五个区域
在这里插入图片描述
方法区:存储的是虚拟机加载的类和一些常量 static修饰的变量
堆:JVM启动的时候,存放java的实例对象
虚拟机栈:java的方法内存模型. 叫做栈帧. 每个栈帧里面存放的有(局部变量/基本的数据类型变量/引用类型的地址).
程序计数器:线程的私有数据 ,用来记载下一条指令的地址.
本地方法栈:native

2.Java Memory Model(JMM)java内存模型
(规格 规范)
在这里插入图片描述
二丶硬件内存架构与java内存模型
1.硬件内存模型
在这里插入图片描述

2.java线程与硬件处理器
在这里插入图片描述
3.java线程与硬件内存的架构关系
在这里插入图片描述
4.java内存模型存在的必要性
为了解决java线程的不安全性
三丶java内存模型对并发特征的保证
1.Java并发编程的三个重要特征
原子性: 不可分割的操作
有序性: 次序,java代码中的次序 和 CPU中的执行顺序(不是一样的)
可见性: 线程内部的私有数据对其他的线程是不可见的
2.JMM对三大特性的保证

A.JMM与原子性
比如 x=10 只有一个写操作 具有原子性
y = x 第一步 线程x读到工作空间,
第二步 x 写入到y 的空间
第三步 主存中刷新y的值 没有原子性
i++ 也没有原子性
z=z+1 也没有原子性
多个原子性的操作组合到一起就没有原子性
简单的赋值操作是有原子性的
JMM 只保证了基本的读取和赋值操作是有原子性的
Sychronized Lock类的lock方法.

B.JMM与有序性
volatile
sychronized
lock(显示锁)
happens-before规则
1)程序次序
2)锁规则:后一次加锁必须在前一次解锁.
3)volatile 规则:用volatile修饰的变量次序不能变化
4)传递规则:A->B ->C, 得出A-> C
5)中断规则:interrput()
6)线程终结:线程死亡之前,逻辑单元应该执行完成.
7)对象的终结:finalize()

C.JMM与可见性
volatile: 一个工作空间读取了以后,将Cache Line置为无效状态. 然后其他CPU的线程
在执行的时候,就从Cache读不到,需要从主存中重新读.

点击阅读全文
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐