MESI协议(缓存一致性)
M | modfity | 修改 |
E | Exlusive | 独自 |
S | Share | 共享 |
I | Invalid | 时效 |
但是由于M与E之前切换会阻塞,通过加storebuffer和loadbuffer解决阻塞问题
storeBuffer:处理器把它想要写入到主存的值写到storeBuffer,然后继续去处理其他事情。当所有失效确认都接收到时,数据才会被提交
劣势:
- 无法保证什么时候buffer里面的数据会被提交
- 由于线程可以直接操作memory中的数据也有可以会操作buffer,这会导致重排序的问题
Store Forwarding:处理器会先去buffer里面读取,但buffer中的数据未提交,这种解决方案称为Store Forwarding,它使得加载的时候,如果存储缓存中存在,则进行返回
重排序
解决方案:
- cpu处理器通过memorybarrier
- JVM引入四种内存屏障
LoadLoadBarrier |
StoreStoreBarrier |
LoadStoreBarrier |
StoreLoadBarrier |
- JMM模型
缓存行(内存中常用以64个字节为一行)
伪共享:根据空间的局部性,对缓存行中的某一部分进行操作时会影响整个缓存行
解决方案:
class A{
Long a;
}
改为
class A{
Long p0,p1,p2,p3,p4,p5,p6;
Long a;
Long q0,q1,q2,q3,q4,q5,q6;
}
由于Long为8个字节,这样手动去拼一个缓存行解决问题
- JDK可以通过注解实现
@sum.misc.contended
以上是自己总结的知识点,之后会慢慢补全