CPU内存模型 和 JAVA内存模型 讲解

CPU 内存模型

在讲解 JAVA 内存模型之前,先了解 CPU 内存模型,因为JAVA内存模型跟它是十分相似的。
CPU内存模型
图中的 Core 就是一个 CPU。可以看得出:

  1. L1 和 L2 是每个CPU自己的高速缓存
  2. L3 是多个CPU之间共享缓存。
  3. 黄色的就是主内存。
  4. L1、L2、L3 的存储的速度、以及存储的东西逐渐减少。
  5. L1 和 L2 的缓存命中率均为 80%
  6. 达到 L3 缓存的数据占比 4% 左右。

JAVA 内存模型

在这里插入图片描述
可以看得出这个跟 CPU 内存时十分相似的。黄色部分 Memory 相当于 CPU 的 L3 缓存了。
同时也可以看到啊, Copy Memory 是拷贝过来的。也正因为这个东西的存在,引出了变量的可见性问题。

可见性问题

class XXX {
	private static int a = 0;
	Thread threadA = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " a = " + a);
            a = 1;
            System.out.println(Thread.currentThread().getName() + " a = " + a);
        }, "ThreadA");


        Thread threadB = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + " a = " + a);
            a = 1;
            System.out.println(Thread.currentThread().getName() + " a = " + a);
        }, "ThreadB");
}

当 new 多个线程去修改 a 这个变量时,就会出现可见性问题。也就是 : thread-A :a ->1 。但是 thread-B 不一定读到 a 就是1,可能还是 0 ;

重排序问题

简单解释:

java 在执行程序时,可能会对指令进行重排。也就是按照代码顺序:

b = 1;
x = a;

但是执行时可能会变成:

x = a;
b = 1;

源代码到真正执行一般会经过:
源代码 -> 编译器重排序 -> 处理器重排序 -> 最终执行顺序

但是呢!!! 重排序也不是无条件去重排序的。他必须遵循一个 happen-before 规则。

happen-before 规则:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charlven

你的鼓励将是我最大的动力哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值