CPU层面看内存模型
在如今的多CPU计算机中,每个CPU都有属于自己的多级缓存(一般分为L1、L2、L3三级缓存);缓存与内存
是独立存在的,缓存使用SRAM技术实现,内存使用DRAM技术实现。
由于CPU的运算处理速度与内存读写速度差异巨大,CPU往往需要等待"内存数据"。缓存的出现就是为了
解决这个问题,提高CPU访问数据的效率降低等待时间(先从高速缓存读(L1->L2->L3),没有才去内存)。
但是缓存的出现也带来了很多新问题,比如多个CPU同时操作同一个内存地址(共享变量),会发生什么?
某个CPU在对这个内存地址进行了写操作后,其他的CPU在什么条件下可以看见相同的结果(可见性)?
所以在CPU的层面,内存模型定义了一系列的规范,保证任何CPU的的写入动作对其他CPU都是可见的。
那这种可见性应该如何实现的呢?
有些CPU使用强内存模型实现可见性,所有CPU任何时候都能看见任意内存位置相同的值。
对于那些使用弱内存模型CPU,需要执行一些特殊指令(MemoryBarrier,内存屏障)以实现可见性。
内存屏障的作用
1.强制把缓存中的脏数据等写回主内存,将缓存中相应的数据失效
2.禁止指令重排序:屏蔽内存屏障两侧一些不必要、或者会带来负面影响的重排序优化
Java内存模型(JMM) 与JVM
1.JMM是JVM规范中的一种,定义了JVM的内存模型(注意JMM与 JVM内存区域/JVM内存区域 完全是不同的概念)
2.JMM是一种符合内存模型规范的,屏蔽了各种硬件和操作系统访问差异的,保证Java程序在各种平台下
对内存的访问都能保证效果一致的机制及规范
3.JMM的主要目的就是保证多线程并发场景中的原子性、可见性、有序性
4.在Java中包含了几个关键字:volatile、final和synchronized,帮助程序员把代码中的并发需求描述给
编译器。Java内存模型中定义了它们的行为,确保正确同步的Java代码在所有的处理器架构上都能正确执行。
4.JMM规定所有变量都存储在内存(主内存),主内存是共享内存区域,所有线程都可以访问。
但线程对变量的读写必须在工作内存中进行。首先将变量从主内存拷贝到自己的工作内存中,然后对变量
进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量。
参考链接:
关于JMM详细解读看这里 zhuanlan.zhihu.com/p/29881777
不足之处 请批评指正