我知道分配对象引用通常是原子的,例如我们分配给字段。但是当我们分配给ref
参数时,这是否适用?
void Method(ref Class1 obj)
{
var newobj = new Class1();
obj = newobj; // is this assigment an atomic and thread safe operation?
}
答案 0 :(得分:3)
这取决于:Class1
真的是class
(或interface
,还是delegate
)?如果它是struct
:它可能是非原子的(大小是影响它的一个主要因素);然而,引用更新始终是原子的;这是由语言规范保证的。至于"线程安全" - 这更复杂 - 这取决于其他值如何读/写字段。例如,不保证其他线程会立即注意到交换,除非它们正在进行易失性读取。
答案 1 :(得分:1)
是。赋值是自包含的(特别是因为您正在分配内存地址)。你不能确定另一个线程是否在一瞬间不改变变量(所以你不能在obj == newobj
之后直接确定obj = newobj
),但你可以确定你的值不是被覆盖了。
在像List<T>
这样的情况下,您有这种风险,因为一次方法调用会导致后面的多个对象更改。