我知道分配對象引用通常是原子的,例如我們正在分配給字段。但是,當我們分配給ref
參數時,這是否成立?給方法的ref參數分配一個原子操作嗎?
void Method(ref Class1 obj)
{
var newobj = new Class1();
obj = newobj; // is this assigment an atomic and thread safe operation?
}
我知道分配對象引用通常是原子的,例如我們正在分配給字段。但是,當我們分配給ref
參數時,這是否成立?給方法的ref參數分配一個原子操作嗎?
void Method(ref Class1 obj)
{
var newobj = new Class1();
obj = newobj; // is this assigment an atomic and thread safe operation?
}
取決於:是Class1
真的是class
(或interface
或delegate
)?如果它是struct
:它可能是非原子的(大小是影響此的一個主要因素); 參考更新,但是,總是原子;這是由語言規範保證的。至於「線程安全」 - 這更復雜 - 取決於其他值如何讀寫字段。例如,不保證其他線程會立即注意到交換,除非他們正在進行易失性讀取。
是的。分配是獨立的(特別是因爲您正在分配內存地址)。你不能確定另一個線程是否在一秒之後沒有改變變量(所以你不能確定obj == newobj
直接在obj = newobj
之後),但是你可以確定你的值沒有被覆蓋。
在像List<T>
這樣的情況下,您有這種風險,因爲一個方法調用可能導致背後有多個對象更改。