CPU内存模型 和 JAVA内存模型 讲解
2020/4/2 17:01:37
本文主要是介绍CPU内存模型 和 JAVA内存模型 讲解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
CPU 内存模型
在讲解 JAVA 内存模型之前,先了解 CPU 内存模型,因为JAVA内存模型跟它是十分相似的。
图中的 Core 就是一个 CPU。可以看得出:- L1 和 L2 是每个CPU自己的高速缓存
- L3 是多个CPU之间共享缓存。
- 黄色的就是主内存。
- L1、L2、L3 的存储的速度、以及存储的东西逐渐减少。
- L1 和 L2 的缓存命中率均为 80%
- 达到 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 规则:
这篇关于CPU内存模型 和 JAVA内存模型 讲解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?