多线程相关知识之内存屏障

来源:https://www.bilibili.com/video/BV1Rv411y7MU?from=search&seid=9769842728262062596

内存屏障

硬件层的内存屏障分为两种:Load Barrier(读屏障) 和 Store Barrier(写屏障)。内存屏障主要有以下两个作用:

1.阻止屏障两侧的指令重排序;
关于指令重排序的概念参照博客:https://blog.csdn.net/qq_41899026/article/details/118641516

2.强制把写缓冲区/高速缓存中的脏数据(在当前工作内存中修改过的数据)等store到主内存,同时让缓存中相应的数据失效。

在JSR(JavaSpecification Requests, Java 规范提案)中定义了4种内存屏障:

  • LoadLoad屏障(读读屏障):(指令Load1; LoadLoad; Load2),在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

  • LoadStore屏障(读写屏障):(指令Load1; LoadStore; Store2),在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。

  • StoreStore屏障(写写屏障):(指令Store1; StoreStore; Store2),在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

  • StoreLoad屏障(写读屏障):(指令Store1; StoreLoad; Load2),在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能

对于volatile关键字,按照规范会有下面的操作:

  • 在每个volatile写入之前,插入一个StoreStore,写入之后,插入一个StoreLoad
  • 在每个volatile读取之前,会在之后连续插入LoadStore和LoadLoad屏障

通过上面两个操作说明,volatile关键字可以禁止指令重排

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值