ThreadStatic и синхронизация

У меня есть следующий код. Это может быть глупый вопрос, но я не уверен, если нужна синхронизация или нет.


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 не нуждаются в синхронизации, поскольку состояние не используется. Но что такое статический приемник и инициализация?

Ответ 1

Я знаю, что поля ThreadStatic не нуждаются в синхронизации, потому что состояние не используется. Но что такое статический приемник и инициализация?

Для этого также не требуется блокировка для синхронизации, поскольку данные (поле поддержки) будут уникальными для каждого потока. Вы можете безопасно удалить блокировку здесь.

Обратите внимание, что с .NET 4 вы можете также использовать ThreadLocal<T> вместо [ThreadStatic] для хранения любых данных локального потока. Есть несколько преимуществ, как с точки зрения использования (например: IsValueCreated), так и очистки, так как вы можете вызвать Dispose() для очистки всех экземпляров на все потоки напрямую.