缓存不一致问题
在单CPU的时代里,随着CPU性能的不断提升,cpu的处理速度远超过cpu访问内存的速度,使得cpu必须等待IO完成,极大的浪费了CPU的性能。因此缓存技术诞生了,缓存可以将cpu经常访问的内存数据复制一份放在缓存中供cpu读取,而访问缓存的速度远比访问内存的速度快的多。但是随着多cpu和多cpu核心的出现,这样的缓存技术出现问题。通常来说,每个线程都会映射到各个CPU核心中并行运行,每个核心都有一个私有的缓存。当线程A将变量i拷贝到缓存A中进行修改但是还没写回到主存当中时,线程B也从主存中拷贝相同的数据到缓存B,因此此时两个缓存里各有一个互不相同的变量i,这就是所谓的缓存不一致问题。为了解决缓存一致性问题,需要处理器访问缓存时遵循一定的协议。不同的CPU硬件生产厂商,具体的实现不一样。Intel的MESI协议最出名。
![](https://img.haomeiwen.com/i15704538/ddbe43998934a3f6.png)
JAVA内存模型
主流语言如C/C++通常使用物理硬件和操作系统的内存模型,因此会由于不同平台上内存模型的差异造成内存访问出错的问题。而JMM通过定义一套规范来屏蔽掉各种硬件和操作系统的内存访问差异,保证java程序在各个平台下达到一致的内存访问效果。而java内存模型(JMM)仿照上述硬件缓存架构的设计,实现了一套JVM层面的缓存一致性。
![](https://img.haomeiwen.com/i15704538/216a37ade2ad07d3.png)
JVM运行程序的实体是线程,每个线程都会创建一个类似缓存的工作内存(Working Memory),工作内存保存了该线程用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存的变量。不同线程之间无法直接访问对方工作内存中的变量。线程间的通信是通过共享主内存的方式实现的。
网友评论