这是初始化 [ThreadStatic] 的线程安全方式吗?

Posted

技术标签:

【中文标题】这是初始化 [ThreadStatic] 的线程安全方式吗?【英文标题】:Is this a thread safe way to initialize a [ThreadStatic]? 【发布时间】:2010-11-08 10:12:43 【问题描述】: [线程静态] 私有静态 Foo _foo; 公共静态 Foo CurrentFoo 得到 如果(_foo == null) _foo = new Foo(); 返回_foo;

前面的代码线程安全吗?还是我们需要锁定方法?

【问题讨论】:

【参考方案1】:

如果它的 ThreadStatic 每个线程有一个副本。因此,根据定义,它是线程安全的。

This blog has some good info on ThreadStatic.

【讨论】:

这就是我的例子的来源。我只是想弄清楚一个线程是否有可能获得 _foo == null 但随后发生线程切换并且另一个线程 _foo 即使它不为 null 也会被更新? 不。每个线程一个 _foo,因此上下文切换没有影响。【参考方案2】:

[ThreadStatic] 是线程本地存储的编译器/语言魔法。换句话说,它是绑定到线程的,所以即使有上下文切换也没关系,因为没有其他线程可以直接访问它。

【讨论】:

以上是关于这是初始化 [ThreadStatic] 的线程安全方式吗?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里存储当前 WCF 调用的数据? ThreadStatic 安全吗?

谈谈ThreadStatic

使用带有 async/await 的 ThreadStatic 变量

所有活动 ThreadLocal<T> 和 [ThreadStatic] 引用的列表

将 [ThreadStatic] 属性应用于外部程序集中的方法

NET问答: ThreadStatic 和 ThreadLocal<T; 哪一个更好 ?