別のスレッドがそれに方法を実行している間、オブジェクト参照を無効(.NET)
-
18-09-2019 - |
質問
(私は.NETのCLRに興味があります)。
別のスレッドが元のオブジェクトのメソッドを実行している間1つのスレッドがオブジェクトに変数の参照を変更したときに何が正確になりますか?
たとえば、タイプFoo
がタイプBar
の変数「バー」を有し、かつBar
は何のクラスレベルの状態を(今のところ少なくとも、私はこのシナリオをシンプルにしたいのですが)持っていないと言います
// Thread 1
foo.Bar = new Bar();
foo.Bar.SomeMethod();
ところで、これは実行を終了する前に...
// Thread 2
foo.Bar = new Bar();
何があった(?)されたスレッド1上で実行する方法はどうなりますか?それは既にスタックに完了する必要があるすべてのものですか?
スレッド2が代わりにこれを実行した場合、それは物事を変えていますか?
foo.Bar = null;
解決
SomeMethod()
内であることが保証されている場合は、、そして珍しい何も起こりません - 。this
は、メソッドの暗黙の引数なので、直接(それがある方、またはプロパティ)フィールドの値を使用したことがないでしょう。
あなたが本当にそれを保証することができるかどうかは別の問題です。
他のヒント
- 編集:。混乱文を修正
まあ、実際にそれが突然実現しますコール好きではないですので、アトミックになり、変数への代入「ああ私の私がnullだと!」 .SomeMethod実行中()
を何が発生する可能性が、しかし、(多分)それは最初にnullに設定スレッド2がありますのでfoo.Bar.SomeMethod()自体は、呼び出されることはないということです。それだけで(それがnull参照例外でクラッシュします)実行されません。
同じことがあなたの最初の例に適用されます。それだけで、新しいオブジェクトに.SomeMethodと呼ぶことにします。
私は、あなたが.SomeMethodは、右の実行中に、物事が変更される可能性を考えていると思いますか?いいえ。何もそこに変更されます。それはまだ自身のコンテキストを持つことになります。
別のスレッドが元のオブジェクトのメソッドを実行している間1つのスレッドがオブジェクトに変数の参照を変更したときに何が正確になりますか?
何が起こるかは、あなたが適切にこれらのフィールドへのアクセスを同期するために、あなたのコードを書き換えることです。