我有一个对象,我正在从两个线程访问。一个线程在返回值的对象上调用一个长时间运行的成员函数。第二个线程更新用于生成该值的对象。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