【发布时间】:2014-08-30 08:21:19
【问题描述】:
一位朋友问我,ThreadStatic 和 ThreadLocal 哪个更好。检查我告诉他的文档 ThreadLocal 看起来更方便,自 .NET 4.0 起可用,但我不明白为什么要使用它们中的任何一个来为线程创建对象实例。它们的目的是存储“线程本地数据”,因此您可以不那么笨拙地调用方法并避免在某些情况下锁定。当我想要这样的线程本地数据时,我总是在创建类似的东西:
类线程处理程序 { 某A类; 公共线程处理程序(SomeClass A) { 这个.A = A; } 公共无效工人() { } }如果我只想触发并忘记线程,它会是 new Thread(new ThreadHandler(new SomeClass()).TheWorkerMethod).Start(),如果我想跟踪线程,它可以添加到集合中,如果我想跟踪数据ThreadHandler可以添加到集合中,如果我想同时处理我可以为ThreadHandler创建Thread属性并将ThreadHandler放入集合中,我想要线程池它是QueueUserWorkItem而不是new Thread()。如果作用域很简单,它就很短很简单,但如果作用域变宽,它就很容易扩展。
当我试图用谷歌搜索为什么在对象实例上使用 ThreadLocal 时,我的所有搜索最终都解释了 ThreadLocal 比 ThreadStatic 大得多,在我看来,这就像人们在解释他们有这个笨拙的螺丝刀,但现在是工具箱有重型活动扳手,更方便敲钉子。虽然工具箱一开始就有一把锤子。
我知道我遗漏了一些东西,因为如果 ThreadStatic/ThreadLocal 没有优势,它们就不会存在。有人可以指出 ThreadLocal 与为线程创建对象实例相比至少有一个显着优势吗?
UPD:看起来像 this 的两倍,我想当我在谷歌上搜索“java”关键字时让我失望了。所以至少有一个优势 - ThreadLocal 更自然地与任务并行库一起使用。
【问题讨论】:
标签: c# .net multithreading