9

Jon Skeetの記事 とmsdn のこの記事を読んだ後、まだ質問があります。

私がこのコードを持っているとしましょう:

  MyPerson mp = new MyPerson(); //Field

  int g=0; //Field

  public void DoWork ()
   {
      int i;
      MyPerson mp2 = new MyPerson();  
      ...
   }

ここで、2 つのスレッドがあるとします。実行されDoWorkます。(今のところ無視しましょう、競合状態)

  • 両方とも同じものを見るのgでしょうか、それとも各スレッドに独自のアイテムが表示されるのでしょうか? ? ( 価値 )

  • 両方とも同じものを見るのmp でしょうか、それとも各スレッドに独自のアイテムが表示されるのでしょうか?? ( 実例 )

  • 両方とも同じものを見るのiでしょうか、それとも各スレッドに独自のアイテムが表示されるのでしょうか? ( 価値 )

  • 両方とも同じものを見るのmp2でしょうか、それとも各スレッドに独自のアイテムが表示されるのでしょうか? ( 実例 )

  • 両方が同じものを表示する場合、なぜ私が必要なのstaticですか?

私はこのトピックについて多くを検索しましたが、次のような記事を見つけることができませんでした:異なるスレッド、参照タイプ、および値タイプ... )

4

2 に答える 2

13

どちらのスレッドも単に「実行DoWork」するわけではありません。DoWork それらは特定のオブジェクトで実行されます。2つのスレッドが異なるインスタンスを対象として作成されている場合、mpgは完全に別個のフィールドになります。2つのスレッドが同じインスタンスをターゲットとして作成された場合、mpgは共有されますvolatile、同期またはアクセスを使用しない限り、スレッドが他のスレッドによって行われた変更を認識できるという保証はありません。

例えば:

var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
Thread thread2 = new Thread(obj.DoWork); // clearly targeting the same instance

vs

var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
obj = new SomeObject();
Thread thread2 = new Thread(obj.DoWork); // targeting a different instance

ローカル変数imp2は、各スレッドに厳密に固有です。

追記:それらが別々のフィールド/ローカルであっても、...後でコードの一部が再割り当てされmpたり、同じオブジェクトmp2を参照したりすると、同じオブジェクトをめちゃくちゃになります。同じ同期/volatileルールが適用されます。

于 2012-12-03T10:37:51.253 に答える
3

変数gmpは、それを含むクラスに対して「グローバル」であるため、これらは両方のスレッドで見られるのと同じオブジェクトになります。イベントiで宣言されるローカル変数です。DoWorkその後、これはバックグラウンド/代替スレッドにのみ「表示」されます。

それらは同じものを「見ない」ので、staticこの場合のキーワードは関連性がありません。

これがお役に立てば幸いです。

于 2012-12-03T10:35:16.083 に答える