spring boot

并发--内存屏障

2019-03-28  本文已影响0人  简书徐小耳

并发--内存屏障

参考:https://www.jianshu.com/p/43af2cc32f90

内存屏障

基本屏障类型

tips:举个例子, Store1 Store2 Load1 StoreLoad屏障 Store3 Load2 Load3,该屏障是禁止屏障左侧的store和右侧的load进行指令交换,对于
即Store1可以和Store2互换,Load2可以和Load3互换。不支持屏障前的指令换到屏障后。当屏障前发送store操作,会等待写缓冲刷入到高速缓存或者主内存,在屏障之后的读操作则会将无效队列里面的操作执行清空,cpu直接从其他高速缓存或者主内存获取最新值。

LoadLoad屏障:确保 Load2执行的时候,Load1已经执行完毕了

StoreStore屏障:确保store2操作的时候,store1的操作被其他cpu core发现

LoadStore屏障:确保store1操作的时候,Load1已经执行完成

StoreLoad屏障:确保load1执行的时候,store1的操作被其他cpu core 发现。。它的开销是四种屏障中最大的(冲刷写缓冲器,清空无效化队列)。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。

内存屏障的分类

按照可见性保障来分类

这两个屏障一起保证了数据在多处理器之间是可见的。

按照有序性保证来分类

这两个屏障一起保证了临界区中的任何读写操作不可能被重排序到临界区之外。

volatile(我们的读写锁是基于voliate开发的)

在每个volatile写操作的前面插入一个StoreStore屏障。

在每个volatile写操作的后面插入一个StoreLoad屏障。

在每个volatile读操作的后面插入一个LoadLoad屏障。

在每个volatile读操作的后面插入一个LoadStore屏障。

synchronize

通过moitorenter和moitorexit两个指令实现

可以发现,与volatile类似,synchronized底层也是通过释放屏障和获取屏障的配对使用保障有序性,加载屏障和存储屏障的配对使用保障可见性。最后又通过锁的排他性保障了原子性。

上一篇 下一篇

猜你喜欢

热点阅读