我有一个从两个线程访问的对象。一个线程在返回值的对象上调用一个长时间运行的成员函数。第二个线程更新用于产生该值的对象。
如果我在第一个线程执行时调用 Interlock.Exchange 从第二个线程替换对象: 1. 旧线程的自身是否会保留对原始对象的引用。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();
}
}
这是否保证总是打印“旧”?谢谢。