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()
очистить все экземпляры во всех потоках напрямую.