是否需要在C#中通过内存屏障访问不可变对象?

drr*_*drr 5 c# memory immutability barrier

当一个不可变对象在一个线程中新建,并在第二个线程中共享(比如作为共享对象的字段)时,第二个线程不应该同步吗?

Thread1:
=========
 x = new SomeObject()

Thread2
=========
if (x != null)
 x.DoSomething()
Run Code Online (Sandbox Code Playgroud)

在x.DoSomething()之前是否应该有内存屏障?是否有可能第一个线程中的x分配对第二个线程永远不可见?.NET的安全发布模式是什么?

Pet*_*man 2

是的,线程 2 有可能永远不会在您编写的代码中看到 x 的非空值(取决于代码的优化方式)。您不需要显式的内存屏障。只需将 x 声明为 volatile 即可。