首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防线程懒惰

防线程懒惰
EN

Stack Overflow用户
提问于 2015-12-25 14:37:50
回答 2查看 981关注 0票数 4

我很好奇下面的示例代码是否线程安全:

代码语言:javascript
复制
public class Test
{
    [ThreadStatic]
    private static Foo current;

    public static Foo GetFoo()
    {
        return current ?? (current = new Foo());
    }
}

public class Foo
{
}

通常情况下,我会使用Lazy<T>,但是由于每个线程都有一个单独的变量,所以属性本身应该是线程安全的,对吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-25 14:41:31

您提供的代码看起来非常安全。如果您对Lazy<T>感到满意,您可以使用ThreadLocal<T>,它可以以类似的方式工作,但是可以将它的值安全地存储在每个线程上。

代码语言:javascript
复制
// 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

票数 5
EN

Stack Overflow用户

发布于 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正确地初始化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34463745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档