《蹲坑也能进大厂》多线程系列-volatile、happens-before、三级缓存

本章结束就要结束Java内存模型的讲解了,虽说结束,但是后面会一直贯穿在各个知识点中,多线程比较基础的知识点讲解的差不多了,本文正式引入了对volatile的分析,接下来的几章也会对线程池CASThreadLocal原子类AQS并发集合等逐步讲解,看完这一系列,谁还能与你争锋(依旧狗头护体)。

啪啪啪...看我如何打脸

正文

我:狗儿,你昨天提及了主内存和工作内存,上次介绍有点太糙了,今天可以再仔细说一下嘛

好的呀,我都依你。

说到JMM主内存和工作内存,我们就必须要先了解一下CPU缓存结构

三级缓存.png

Core0、Core1代表两个核

L1:每个核上有两个L1, 一个用于存数据(Data Cache),一个用于存指令(Instruction Cache)

先看上图,CPU存在三级缓存L1/L2/L3,你可能会想CPU是闲着没事干,设计那么多层内存干啥,直接从主存(物理内存)中读写数据他不香吗,这样就省事多了。但是我们要思考一下,CPU办事效率非常高,处理速度和物理内存相比不在同一个层级,如果CPU每次的读写都直接和主存交互,这样会大大降低指令的执行速递,这也就引出了这三级缓存。

a = a + 1

举个简单的栗子,当线程执行这个语句时,会先从主存当中读取变量a的值,拷贝到高速缓存中,然后CPU执行指令对变量a进行加1操作,并将数据写入缓存,最后将高速缓存中变量a修改后的值刷新到主存当中。

拓展:线程在获取数据时首先会在最快的缓存中(L1)找数据,如果缓存没有命中(Cache miss) 则往下一级找, 直到三级缓存都找不到时,那只有向内存(Main Memoy)查找数据了,未命中的次数越多,耗时也就越长。

我:那这个和我们JMM的内存结构有什么关系嘞?

Java作为一门高级语言,屏蔽了这些底层细节,而是JMM定义了一套读写内存的规范。在JMM中,主内存和工作内存并非真正意义上的物理划分,而是JMM的一种抽象,它将

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值