我很好奇下面的示例代码是否线程安全:
public class Test
{
[ThreadStatic]
private static Foo current;
public static Foo GetFoo()
{
return current ?? (current = new Foo());
}
}
public class Foo
{
}通常情况下,我会使用Lazy<T>,但是由于每个线程都有一个单独的变量,所以属性本身应该是线程安全的,对吗?
谢谢。
发布于 2015-12-25 14:41:31
您提供的代码看起来非常安全。如果您对Lazy<T>感到满意,您可以使用ThreadLocal<T>,它可以以类似的方式工作,但是可以将它的值安全地存储在每个线程上。
// Thread-Local variable that yields a name for a thread
ThreadLocal<string> ThreadName = new ThreadLocal<string>(() =>
{
return "Thread" + Thread.CurrentThread.ManagedThreadId;
});https://msdn.microsoft.com/en-us/library/dd642243(v=vs.110).aspx
发布于 2015-12-25 14:40:53
代码确实是Thread-safe,但是请记住,将有自己的实例,这意味着,在Singleton中,您不应该使用ThreadStaticAttribute。
我为这个属性找到的更有用的用法是不使用Thread-safe类Thread-safe --比如Random。
如果从多个Random.Next调用,则Random.Next可能返回0,使得ThreadStatic使每个Thread的实例不同。
另一方面,ThreadStatic不会自动初始化每个Thread的字段。
另一方面,ThreadLocal允许您提供像Lazy<T>一样使用的初始化方法,并在每个Thread的第一次访问中为您初始化一些东西。
注意,ThreadLocal<T> Value 将要求您通过其Value属性访问实际数据。
另外,您的初始化仍然在GetFoo方法中,因此每个实例也将使用ThreadStatic正确地初始化。
https://stackoverflow.com/questions/34463745
复制相似问题