每日一个知识点系列:volatile的可见性原理

每日一个知识点系列的目的是针对某一个知识点进行概括性总结,可在一分钟内完成知识点的阅读理解,此处不涉及详细的原理性解读。

img

img

看图说话

关键点1: 总线嗅探器(MESI 缓存一致性原理 )

关键点2: 总线锁、缓存锁,为了解决并发问题,会在内存区域的值加锁(内存锁),是在store 之前会给总线内的值加一个锁,write 完成后在解锁(这里大部分是缓存行锁的,总线锁看情况)。

关键点3:

就是为了使一个CPU上运行的线程能够读取到另外一个CPU线程的共享变量更新。这个CPU必须先根据无效化队列中存储的消息,删除相应高速缓存内的数据副本,从而在其他CPU更新共享变量时能通过缓存一致性协议同步到该CPU的高速缓存中。内存屏障中的加载屏障 (Load Barrier)就是用来解决这个问题的。Load Barrier会根据会根据无效化队列内容的内存地址,将其他CPU上使用了该缓存的高速缓存中对应的数据状态标记为I,从而使用该CPU后续针对这个的读操作时必须先发送Read消息,以将其他处理器对相关共享变量所做的更新同步到该处理器的高速缓存中。

总结:

当修改了增加volatile 的变量时,会马上将变量值写回到主内存中,这时会在store 前对主内存的这个变量加锁,在store 通过总线的时候触发MESI缓存一致性协议,通过总线嗅探器将其他cpu工作内存中的此变量置为无效状态(涉及内存屏障)。当次cpu 完成变量的write 操作时,在对变量进行解锁。

书籍:

推荐一本非常好的关于这方面的书籍,一本书帮你扫平多线程内容,扫码回复暗号获取:01

每日一个知识点系列:volatile的可见性原理

往期推荐

img

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsffjx.html