分配给方法的ref参数进行原子操作?

时间:2014-09-30 07:15:15

标签: c# multithreading thread-safety

我知道分配对象引用通常是原子的,例如我们分配给字段。但是当我们分配给ref参数时,这是否适用?

void Method(ref Class1 obj)
{
    var newobj = new Class1();
    obj = newobj; // is this assigment an atomic and thread safe operation?
}

2 个答案:

答案 0 :(得分:3)

这取决于:Class1真的是class(或interface,还是delegate)?如果它是struct:它可能是非原子的(大小是影响它的一个主要因素);然而,引用更新始终是原子的;这是由语言规范保证的。至于"线程安全" - 这更复杂 - 这取决于其他值如何读/写字段。例如,不保证其他线程会立即注意到交换,除非它们正在进行易失性读取。

答案 1 :(得分:1)

是。赋值是自包含的(特别是因为您正在分配内存地址)。你不能确定另一个线程是否在一瞬间不改变变量(所以你不能在obj == newobj之后直接确定obj = newobj),但你可以确定你的值不是被覆盖了。

在像List<T>这样的情况下,您有这种风险,因为一次方法调用会导致后面的多个对象更改。