JMM 笔记

  1. JVM 内存结构 2. Java 内存模型 3. Java 对象模型

Java 代码到 CPU 指令

不同的 JVM 对 .class 文件有不同的翻译,不同的 CPU 平台的机器指令千差万别;
所以在 Java 代码层写的各种Lock,最后依赖的是JVM的具体实现和 CPU 的指令,
才能帮我们达到线程安全的效果
由于最终效果依赖处理器,不同处理器结果不一样,这样无法保证并发安全,所以需要一个
标准,这个标准就是 JMM 。

  1. JVM 内存结构 – 和 Java 虚拟机的运行时区域有关
    线程共有 : 方法区 、 堆
    线程私有 : Java栈(VM stack)、本地方法栈、程序计数器

    堆:存放类实例,对象本身保存在堆中
    虚拟机栈(VM stack): 存放对象的引用, 编译时确定大小,并且大小不会改变
    方法区 : 存储已经加载的 static 静态变量、类信息和常量信息,包含永久引用
    本地方法栈 : native 方法
    程序计数器 : 保存当前线程执行到的行号数

  2. Java 内存模型
    和 Java 的并发编程有关

  3. Java 对象模型 – 和 Java 对象在虚拟机中的表现形式有关
    Java 对象自身的存储模型
    JVM 会给这个类创建一个 instanceKlass , 保存在方法区,用来在 JVM 层表示该 Java 类

JMM – Java Memory Model
为什么需要 JMM
C语言不存在内存模型的概念。依赖处理器,不同处理器结果不一样,导致无法保证并发安全
所以需要一个标准,让多线程运行的结果可预期。

  1. JMM 是一种规范,需要各个 JVM 来遵守,以便于开发者可以利用这些规范,更方便的开发多线程程序
    如果没有这样一种规范,那么久很有可能在经过了不同 JVM 重排序之后,在不同虚拟机上运行结果不一致
  2. JMM 是工具类和关键字的原理
  3. JMM 最重要3点内容 : 重排序、可见性、原子性
  1. 重排序
    重排序的好处:提高处理速度
    重排序的3种情况:编译器优化、CPU指令重排、内存的“重排序”(并不是真正的重排序)
    什么是重排序: 在线程内部两行代码的实际执行顺序和代码在Java文件中的顺序不一致,
    代码指令并不是严格按照代码语句顺序执行的,他们的顺序改变了,这就是重排序

    编译器优化: JVM、JIT 编译器等
    CPU 指令重排
    内存的“重排序” : 线程 A 的修改,线程 B 却看不到,引出可见性问题

  2. 可见性
    为什么会有可见性问题?
    CPU有多级缓存,各个CPU核心都有自己的缓存,导致读的数据过期
    高速缓存的容量比主内存小,但是速度仅次于寄存器,所以在CPU和主内存之间多了CaChe层
    线程间对共享变量的可见性并不是由多核引起的,而是多层缓存引起的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值