关于lock前缀

最近又看了一遍《深入理解java虚拟机》里面讲到Java内存模型时提到了volatile关键字。

volatile关键字两个特性:

  • 1是内存可见性

  • 2是禁止指令重排序优化

禁止指令重排序优化的原理提到了内存屏障,内存屏障实现是基于lock前缀,lock前缀的作用是将
本处理器的缓存写入了内存,该写入动作也会引起别的处理器或者别的内核无效化其缓存。

那么lock前缀为何会引起别的处理器或者内核无效化其缓存。书里没说,网上看到了一些资料。

这里面涉及到了缓存一致性协议

缓存一致性协议有多种,但是日常处理的大多数计算机设备都属于”嗅探(snooping)”协议,它的基本思想是:
所有内存的传输都发生在一条共享的总线上,而所有的处理器都能看到这条总线:缓存本身是独立的,但是内存是共享资源,所有的内存访问都要经过仲裁(同一个指令周期中,只有一个CPU缓存可以读写内存)。

CPU缓存不仅仅在做内存传输的时候才与总线打交道,而是不停在嗅探总线上发生的数据交换,跟踪其他缓存在做什么。所以当一个缓存代表它所属的处理器去读写内存时,其它处理器都会得到通知,它们以此来使自己的缓存保持同步。只要某个处理器一写内存,其它处理器马上知道这块内存在它们的缓存段中已失效

参考资料:

https://www.cnblogs.com/badboys/p/12695183.html

posted @ 2021-02-01 15:49  cfdroid  阅读(336)  评论(0编辑  收藏  举报