我有一個對象,我正在從兩個線程訪問。一個線程在返回值的對象上調用一個長時間運行的成員函數。第二個線程更新用於生成該值的對象。Interlock.Exchange和Garbage Collection的安全
我是否在第一個線程正在執行時調用Interlock.Exchange來替換第二個線程中的對象: 1.舊線程的self會保留對原始對象的引用嗎? 2.是否存在原始對象被垃圾收集的風險?
import System;
import System.Threading;
import System.Generics;
class Example {
var mData = new String("Old");
public void LongFunction() {
Thread.Sleep(1000);
Console.WriteLine(mData);
}
public void Update() {
Interlocked.Exchange(ref mData, "Old");
}
}
class Program {
public static Main(string[] argv) {
var e = new Example();
var t = new Thread(new ThreadStart(e.LongFunction()));
t.Start();
e.Update();
}
}
難道這保證始終打印 「老」? 謝謝。
您很困惑Dispose和finalizer。終止器不會被垃圾收集器顯式調用,終結器也會這樣做。 Interlocked.Exchange不會破壞對象終結...並且您的代碼會拋出NullException。 – 2009-11-22 11:19:16