47、多处理器硬件同步指令与相关概念解析

多处理器硬件同步指令与相关概念解析

1. 内存读写重排序问题

在多线程编程中,单个线程对内存的读写操作可能会被重排序。这种重排序在单线程程序中是不可见的,但在多线程程序中可能会产生意外后果。例如,一个线程填充缓冲区数据后设置指示符标记缓冲区已满,并发线程可能在看到新数据之前就看到指示符被设置,从而读取到陈旧值。Java 内存模型中一些违反直觉的方面会导致类似问题,如第 3 章提到的错误的双重检查锁定模式。

不同架构对内存读写重排序的保证程度不同。一般来说,最好不要依赖这些保证,而是使用更可靠的技术来防止重排序。所有架构都允许强制写入操作按发出顺序执行,但这需要付出代价。

1.1 内存屏障指令

内存屏障指令(有时称为栅栏)可以刷新写缓冲区,确保屏障之前发出的所有写入操作对发出屏障的处理器可见。原子的读 - 修改 - 写操作(如 getAndSet() )或标准并发库通常会透明地插入内存屏障。因此,只有当处理器在临界区之外对共享变量执行读写指令时,才需要显式使用内存屏障。

内存屏障的开销较大,可能需要数百个周期甚至更多,因此应仅在必要时使用。另一方面,同步错误很难追踪,所以应适当使用内存屏障,而不是依赖复杂的特定平台对内存指令重排序限制的保证。

1.2 Java 中的 volatile 关键字

Java 语言允许在同步方法或块之外对对象字段的读写操作进行重排序。Java 提供了 volatile 关键字,确保在同步块或方法之外对 volatile 对象字段的读写操作不会被重排序。使用该关键字的开销也较大,因此

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值