2014-09-30 36 views
2

我知道分配對象引用通常是原子的,例如我們正在分配給字段。但是,當我們分配給ref參數時,這是否成立?給方法的ref參數分配一個原子操作嗎?

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

回答

3

取決於:是Class1真的是class(或interfacedelegate)?如果它是struct:它可能是非原子的(大小是影響此的一個主要因素); 參考更新,但是,總是原子;這是由語言規範保證的。至於「線程安全」 - 這更復雜 - 取決於其他值如何讀寫字段。例如,不保證其他線程會立即注意到交換,除非他們正在進行易失性讀取。

1

是的。分配是獨立的(特別是因爲您正在分配內存地址)。你不能確定另一個線程是否在一秒之後沒有改變變量(所以你不能確定obj == newobj直接在obj = newobj之後),但是你可以確定你的值沒有被覆蓋。

在像List<T>這樣的情況下,您有這種風險,因爲一個方法調用可能導致背後有多個對象更改。

相關問題