2つのスレッドからアクセスしているオブジェクトがあります。1つのスレッドが、値を返すオブジェクトに対して長時間実行されるメンバー関数を呼び出します。2番目のスレッドは、その値を生成するために使用されるオブジェクトを更新します。
Interlock.Exchangeを呼び出して、最初のスレッドの実行中に2番目のスレッドのオブジェクトを置き換えると、次のようになります。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();
}
}
これは常に「古い」を印刷することが保証されていますか?ありがとう。