код действительно Thread
-Safe, но имейте это в виду, что каждый Thread
будет иметь свой собственный экземпляр, что означает, в Singleton, например, что вы не должны хотеть использовать ThreadStaticAttribute
.
Более полезное использование, которое я нашел для этого атрибута, составляет не Thread
-секретные классы Thread
-safe - например, Random
.
Random.Next
может вернуться 0
, если вызывается из нескольких Threads
, что делает его ThreadStatic
делает экземпляры различны для каждого Thread
.
С другой стороны, ThreadStatic
не инициализирует поле автоматически для каждого Thread
.
ThreadLocal<T>
С другой стороны, вы можете предоставить метод инициализации, который используется как Lazy<T>
, и инициализирует материал для вас при первом доступе на каждом Thread
.
Обратите внимание, что ThreadLocal<T>
потребует от вас получить доступ к фактическим данным через его собственность Value
.
Кроме того, ваша инициализация в методе GetFoo
в любом случае, так что каждый экземпляр будет инициализирован с ThreadStatic
тоже.
[MSDN] (https://msdn.microsoft.com/en-us/library/system.threadstaticattribute (v = vs.110) .aspx) четко отвечает на ваш вопрос ' статическое поле, помеченное с помощью ThreadStaticAttribute, не разделяется между потоками. Каждый исполняемый поток имеет отдельный экземпляр поля и независимо устанавливает и получает значения для этого поля. Если поле доступно в другом потоке, оно будет содержать другое значение. ', Поэтому хорошая практика - выработайте себе хотя бы документацию, если застряли - обратитесь за помощью к сообществу – sll
Короткий ответ: да, это полностью поточно-безопасный , Каждый поток, который вызывает 'GetFoo()', будет получать свой собственный «Foo» singleton, лениво. – Cameron