3

(私は .NET CLR に興味があります)

別のスレッドが元のオブジェクトでメソッドを実行しているときに、あるスレッドが変数が参照するオブジェクトを変更すると、正確には何が起こるでしょうか?

たとえば、型に typeFooの変数 'Bar' があり、クラス レベルの状態がないBarとしBarます (少なくとも今のところ、このシナリオは単純にしたいと思います)。

// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();

とりあえず、これが実行を終える前に…

// Thread 2
foo.Bar = new Bar();

スレッド 1 で実行されている (だった?) メソッドはどうなりますか? 完了する必要があるものはすべてスタック上にありますか?

スレッド2が代わりにこれを行うと、状況は変わりますか?

foo.Bar = null;
4

3 に答える 3

3

呼び出しが既に 内にあることが保証されている場合、SomeMethod()何も異常は発生しません -thisはメソッドの暗黙の引数であるため、フィールド (またはプロパティ、どちらであっても) の値を直接使用することはありません。

それを本当に保証できるかどうかは別問題です。

于 2009-08-17T22:45:11.283 に答える
1

-- 編集: 紛らわしい文章を修正。

実際、変数への割り当てはアトミックであるため、呼び出しが突然「ああ、私は null だ!」と認識するわけではありません。.SomeMethod() の実行中

ただし、発生する可能性があるのは、 foo.Bar.SomeMethod () 自体が呼び出されないことです。これは、スレッド 2 が (おそらく) 最初に null に設定するためです。そのため、実行されません (null ref 例外でクラッシュします)。

最初の例にも同じことが当てはまります。新しいオブジェクトで .SomeMethod を呼び出すだけです。

.SomeMethod の実行中に状況が変わる可能性があると考えていると思いますよね? いいえ、何も変わりません。それ自体のコンテキストは引き続き保持されます。

于 2009-08-17T22:42:07.590 に答える
-1

別のスレッドが元のオブジェクトでメソッドを実行しているときに、あるスレッドが変数が参照するオブジェクトを変更すると、正確には何が起こるでしょうか?

これらのフィールドへのアクセスを適切に同期するようにコードを書き直すとどうなりますか。

于 2009-08-17T23:01:09.440 に答える