CPU 三级缓存架构
为平衡CPU与主存的处理速度问题,提出在CPU中设置多级缓存机制。
当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。
每个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存
如果三级缓存都没有,则需要通过主存加载
多核多级缓存数据一致性问题:采用 CPU 缓存一致性协议实现 MESI
java内存模型JMM
内存模型:定义了共享内存系统中多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。
1)主存区: 所有的共享变量必须存放在主存中
2)线程工作区:从主存中读取共享变量的副本,在工作区进行计算,将计算结果更新到主存区
在多线程下修改共享变量,存在数据的可见性、原子性、有序性问题
1、原子性
java通过 字节码指令monitorenter和monitorexit 控制原子性
在AtomicInteger等原子类中,使用CAS机制,进行数据更新
CAS:调用底层的sun.misc.Unsafe类,属于native,本质上是通过CPU硬件特性,自动锁定数据总线
2、可见性
使用volatile
被其修饰的变量在被修改后可以立即同步到主内存,
被其修饰的变量在每次使用之前都从主内存刷新
3、有序性
使用volatile 申明变量
禁止指令重排(通过内存屏障--CPU指令 )
●在每一个volatile的写(store)之前,加入一个StoreStore屏障和一个LoadStore屏障
●在每一个volatile的写(store)之后,加入一个StoreLoad屏障和一个StroeStore屏障
●在每一个volatile的读(load)之后,加一个LoadLoad屏障和LoadStrore屏障