0

静的読み取り専用オブジェクトを使用したロックをよく見かけますが、以下のコードでこのステートメントの意味は何ですか?私はロックがオブジェクトに適用されていることを知っています。これはロックを機能させるための単なるオブジェクトですか?それは単なるハックですか?ここではオブジェクトは必要ありませんが、ロックを機能させるためにオブジェクトを作成するだけですか?

また、単に object obj1= new object() と言う代わりに、readonly と static を使用します。パフォーマンスが向上したためだと思いますが、readonly と static がパフォーマンスの向上にどのように役立つのでしょうか?

static readonly object locker = new object();

コードは次のとおりです。

class ThreadSafe 
{
  static bool done;
  static readonly object locker = new object();

  static void Main()
  {
    new Thread (Go).Start();
    Go();
  }

  static void Go()
  {
    lock (locker)
    {
      if (!done) { Console.WriteLine ("Done"); done = true; }
    }
  }
}
4

2 に答える 2

3

プライベート ロック スキームに干渉する他のコードのロック決定のリスクが低いため、既存のグローバルに表示されるオブジェクトとは対照的に、個別のプライベート オブジェクトを使用してロックすることをお勧めします (この種の問題は、文書化するのが非常に困難であり診断する; したがって、それらを不可能にするのが最善です)。

静的クラスを提供する場合、または意図がアプリケーション全体のロックである場合、そのロッカー オブジェクトは静的である必要があります。また、単一のオブジェクト インスタンスのみをロックする役割を果たし、同じ提供クラスまたはクラス階層の他のオブジェクトの同時処理を許可する場合は、インスタンス オブジェクトである必要があります。

この特定のケースでは、明示的な読み取りオンラインはパフォーマンスに直接的な影響を与えませんが、他のほとんどの場合は (主にリロードを防ぐことによって) 影響を与えるため、すべての読み取り専用オブジェクトにそのようにラベルを付けるのは便利な習慣です。

于 2012-06-01T06:03:43.893 に答える
0

ロックを提供することを唯一の目的とするオブジェクトを使用すると、少し簡単になります。外部コードがロックをいじったり、あらゆる種類の悲しみを引き起こしたりしないようにするために、自分だけが見えるロックが本当に必要です。これを実現する最も簡単な方法は、オブジェクトを作成することです。(他の誰もアクセスできない別のオブジェクトがある場合は、おそらくそれを使用できます...しかし、ロックを他のすべてのものから分離すると、物事を概念的に単純に保つ傾向があります。)

なぜそれが静的なのかについては...それはパフォーマンスの問題ではなく、正確さの問題です。静的メソッドをロックしたり、静的リソースへのアクセスを同期したりするには、インスタンスではなくクラスに属するオブジェクトが必要です。そうしないと、すべてのインスタンスが 1 つのロックを共有するのではなく、独自のロックをロックすることになります。これは、インスタンスが 1 つしかない場合を除き、まったく役に立たず、その場合でも正しくありません。非静的メソッドのstatic場合、何らかの理由で静的プロパティなどにアクセスしていない限り、使用しません。それを使用し、インスタンス間でアクセスを同期する必要がなかった場合、不必要にロックして処理を遅くすることになります。

于 2012-06-01T06:07:31.120 に答える