本章结束就要结束Java内存模型的讲解了,虽说结束,但是后面会一直贯穿在各个知识点中,多线程比较基础的知识点讲解的差不多了,本文正式引入了对volatile的分析,接下来的几章也会对线程池
、CAS
、ThreadLocal
、原子类
、AQS
、并发集合
等逐步讲解,看完这一系列,谁还能与你争锋(依旧狗头护体)。
啪啪啪...看我如何打脸
正文
我:狗儿,你昨天提及了主内存和工作内存,上次介绍有点太糙了,今天可以再仔细说一下嘛
好的呀,我都依你。
说到JMM主内存和工作内存,我们就必须要先了解一下CPU缓存结构
。
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的一种抽象,它将