并发编程之内存屏障

本文详细介绍了内存屏障的概念,包括JVM层面的LoadLoad、LoadStore、StoreStore和StoreLoad四种屏障,并讨论了volatile在JVM实现中的内存屏障策略。此外,还探讨了硬件层面的内存屏障,如X86平台的lfence、sfence、mfence和Lock前缀指令,以及它们在保证数据一致性中的作用。
摘要由CSDN通过智能技术生成

一、 定义

最直观的就是:你如果不想要两行代码进行重排序,那么就在两行代码之间加一个屏障,这个屏障就相当于一个标记,那么jvm在执行到这行代码时,看到这个屏障,就不会重排序了

二、内存屏障的种类

JVM层面的内存屏障

在JSR规范中定义了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的写入对所有处理器可见。它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能

由于x86只有store load可能会重排序,所以只有JSR的StoreLoad屏障对应它的mfence或lock前缀指令,其他屏障对应空操作

拓展点:JSR133规范

x86处理器不会对读-读、读

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值