嵌套在属性getter中的Volatile.Read()是否仍能发挥作用?
Test_1与Test_2方法完全等效吗?
结论:Test_1和Test_2是完全等效的,嵌套在属性getter里的Volatile.Read()不会失去原本的作用。
原因如下:
- 你的
SomeNumber是表达式体属性,每次访问这个属性时,都会执行Volatile.Read(ref _backingField)并返回结果。所以Test_2里的var someNumber = SomeNumber;这行代码,和Test_1里直接写var someNumber = Volatile.Read(ref _backingField);的行为完全一致——都是执行一次Volatile.Read操作,读取_backingField的最新值,然后把结果存入局部变量someNumber。 Volatile.Read的核心作用是生成内存屏障,禁止编译器或CPU将这个读取操作重排到后续代码(比如// do A)之后,同时保证读取到的是内存中的最新值,而非CPU缓存里的旧值。不管是直接调用Volatile.Read,还是通过属性getter间接调用,这个内存语义都会被完整保留——编译器不会因为它藏在属性里就优化掉内存屏障。- 两个方法中,局部变量
someNumber都是在执行Volatile.Read时获取一次值,之后执行// do A的过程中,即使其他线程修改了_backingField,someNumber的值也不会再更新,这一点两者的行为完全一致。
内容的提问来源于stack exchange,提问作者user3163495
相关产品推荐
相关产品推荐

