NET问答: ThreadStatic 和 ThreadLocal<T; 哪一个更好 ?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NET问答: ThreadStatic 和 ThreadLocal<T; 哪一个更好 ?相关的知识,希望对你有一定的参考价值。
咨询区
user2341923:
[ThreadStatic]
被设计成特性, ThreadLocal<T>
被设计成泛型,为什么会有这两种设计方案呢 ?谁能告诉我他们的优缺点各是什么?是不是泛型的方式更好一点?
回答区
Sanjeev:
[ThreadStatic]
背后的运作思路是为每个线程都copy一份变量的一个副本,参考如下代码:
class Program
{
[ThreadStatic]
static int value = 10;
static void Main(string[] args)
{
value = 25;
Task t1 = Task.Run(() =>
{
value++;
Console.WriteLine("T1: " + value);
});
Task t2 = Task.Run(() =>
{
value++;
Console.WriteLine("T2: " + value);
});
Task t3 = Task.Run(() =>
{
value++;
Console.WriteLine("T3: " + value);
});
Console.WriteLine("Main Thread : " + value);
Task.WaitAll(t1, t2, t3);
Console.ReadKey();
}
}
从上面的代码片段可以看出:每个线程都有一个 value 的初始化副本,除了创建它的主线程。
如果你想对所有线程一视同仁
或者有自己的初始化逻辑,这时候就可以用 ThreadLocal
了。
marai:
ThreadStatic 只会在创建它的线程中保留赋值,而 ThreadLocal 会将此赋值保留在所有线程中,比如我的简单测试代码。
class Program
{
public static ThreadLocal<int> _threadlocal = new ThreadLocal<int>(() => 10);
public static void Main()
{
new Thread(() =>
{
Console.WriteLine("First Thread: {0}", _threadlocal.Value);
}).Start();
new Thread(() =>
{
Console.WriteLine("Second Thread: {0}", _threadlocal.Value);
}).Start();
Console.ReadKey();
}
}
点评区
个人感觉 ThreadStatic 和 ThreadLocal 相比,前者算是一个简单粗暴的版本,同时在用 ThreadStatic 时也要了解容易踩到的坑,比如 Sanjeev 大佬的例子中所述:value = 10
只会在创建它的线程中被保留,在其他线程中会被默认为初始值,如:value=0
。
如果你想高度的定制化,可以采用 ThreadLocal
,毕竟你看那些链式跟踪的框架都少不了它的踪影。
以上是关于NET问答: ThreadStatic 和 ThreadLocal<T; 哪一个更好 ?的主要内容,如果未能解决你的问题,请参考以下文章
所有活动 ThreadLocal<T> 和 [ThreadStatic] 引用的列表
使用带有 async/await 的 ThreadStatic 变量
ThreadStatic 与 ThreadStatic 对比ThreadLocal<T>:泛型比属性好吗?