这是初始化 [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 安全吗?
使用带有 async/await 的 ThreadStatic 变量
所有活动 ThreadLocal<T> 和 [ThreadStatic] 引用的列表