3

私は次のコードを持っています。ばかげた質問かもしれませんが、同期が必要かどうかはわかりません。


class MyClass
{
  [ThreadStatic]
  private static object _staticObject;
  private static readonly LockStaticField = new object();

  public static object StaticObject
  {
     get
     {
        lock(LockStaticField)
        {
           return _staticObject ?? (_staticObject = new object());
        }
     }
  }
}

状態が共有されていThreadStaticないため、フィールドに同期は必要ありません。しかし、静的ゲッターと初期化についてはどうですか?

4

1 に答える 1

8

状態が共有されていないため、ThreadStaticフィールドは同期を必要としないことを知っています。しかし、静的ゲッターと初期化についてはどうですか?

データ(バッキングフィールド)はスレッドごとに一意になるため、これも同期するためにロックする必要はありません。ここでロックを安全に解除できます。

.NET 4以降、ローカルスレッドデータを保持するThreadLocal<T>代わりにを使用することも検討する必要があることに注意してください。使用法(例:)だけでなく、すべてのスレッドのすべてのインスタンスを直接クリーンアップするために呼び出すことができるため、クリーンアップ[ThreadStatic]の両方の点でいくつかの利点があります。IsValueCreatedDispose()

于 2012-07-16T15:52:37.897 に答える