- JVM 内存结构 2. Java 内存模型 3. Java 对象模型
Java 代码到 CPU 指令
不同的 JVM 对 .class 文件有不同的翻译,不同的 CPU 平台的机器指令千差万别;
所以在 Java 代码层写的各种Lock,最后依赖的是JVM的具体实现和 CPU 的指令,
才能帮我们达到线程安全的效果
由于最终效果依赖处理器,不同处理器结果不一样,这样无法保证并发安全,所以需要一个
标准,这个标准就是 JMM 。
-
JVM 内存结构 – 和 Java 虚拟机的运行时区域有关
线程共有 : 方法区 、 堆
线程私有 : Java栈(VM stack)、本地方法栈、程序计数器堆:存放类实例,对象本身保存在堆中
虚拟机栈(VM stack): 存放对象的引用, 编译时确定大小,并且大小不会改变
方法区 : 存储已经加载的 static 静态变量、类信息和常量信息,包含永久引用
本地方法栈 : native 方法
程序计数器 : 保存当前线程执行到的行号数 -
Java 内存模型
和 Java 的并发编程有关 -
Java 对象模型 – 和 Java 对象在虚拟机中的表现形式有关
Java 对象自身的存储模型
JVM 会给这个类创建一个 instanceKlass , 保存在方法区,用来在 JVM 层表示该 Java 类
JMM – Java Memory Model
为什么需要 JMM
C语言不存在内存模型的概念。依赖处理器,不同处理器结果不一样,导致无法保证并发安全
所以需要一个标准,让多线程运行的结果可预期。
- JMM 是一种规范,需要各个 JVM 来遵守,以便于开发者可以利用这些规范,更方便的开发多线程程序
如果没有这样一种规范,那么久很有可能在经过了不同 JVM 重排序之后,在不同虚拟机上运行结果不一致 - JMM 是工具类和关键字的原理
- JMM 最重要3点内容 : 重排序、可见性、原子性
-
重排序
重排序的好处:提高处理速度
重排序的3种情况:编译器优化、CPU指令重排、内存的“重排序”(并不是真正的重排序)
什么是重排序: 在线程内部两行代码的实际执行顺序和代码在Java文件中的顺序不一致,
代码指令并不是严格按照代码语句顺序执行的,他们的顺序改变了,这就是重排序编译器优化: JVM、JIT 编译器等
CPU 指令重排
内存的“重排序” : 线程 A 的修改,线程 B 却看不到,引出可见性问题 -
可见性
为什么会有可见性问题?
CPU有多级缓存,各个CPU核心都有自己的缓存,导致读的数据过期
高速缓存的容量比主内存小,但是速度仅次于寄存器,所以在CPU和主内存之间多了CaChe层
线程间对共享变量的可见性并不是由多核引起的,而是多层缓存引起的