【问题标题】:What is advantage of ThreadStatic, ThreadLocal, GetData over creating object instance for a thread?与为线程创建对象实例相比,ThreadStatic、ThreadLocal、GetData 有什么优势?
【发布时间】: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


    【解决方案1】:

    我没有利用 ThreadLocal 为线程创建对象实例。

    你是对的,当你可以控制正在创建的线程以及它们的使用方式时,将整个线程包装在一个辅助类中并让它从那里获取“线程本地”数据是非常方便的.

    问题在于,尤其是在机构规模较大的项目中,您并不总是拥有这种控制权。您可能会启动一个线程并调用一些代码,而该线程可能会在数百万行代码的调用中蜿蜒前行,这些代码分散在 3 个内部团队和一个外部承包商团队拥有的 10 个项目之间。祝你好运,在任何地方都能找到其中的一些参数。

    线程本地存储让这些人无需明确引用表示该线程上下文的对象即可进行交互。

    我遇到的一个相关问题是将数据关联到某个线程该线程创建的每个子线程(因为我的大型项目创建了自己的线程,因此线程本地不再起作用) ,看到我有这个问题:Is there any programmable data that is automatically inherited by children Thread objects?

    归根结底,这通常是懒惰的编程,但有时您会发现恰好需要它的情况。

    【讨论】:

      【解决方案2】:

      ThreadLocal<T> 的工作方式类似于 Dictionary<Thread, T>。字典的问题是属于被杀死或死线程的实例永远存在 - 它们不会被垃圾收集,因为它们被字典引用。使用ThreadLocal 将确保当线程死亡时,该线程引用的实例符合GC 条件。

      另外,它的界面比手动处理Dictionary<Thread, T> 要好得多。它只是工作。

      【讨论】:

      • 我了解 ThreadLocal 优于带有线程键的字典的优势。我没有利用 ThreadLocal 为线程创建对象实例。
      • 这是一个有用的抽象。使用List<T>HashSet<T> 可以使用相同的参数——当你可以只使用一个数组时,为什么还要使用它们呢?它不是必需的,但它以一种经过充分测试的有用方式封装了常用功能。最后,您需要编写的代码越少越好,因为错误潜入的机会就越小。
      【解决方案3】:

      ThreadLocal 与 ThreadStatic 属性方法相比有两个好处,您可以避免定义类字段,并且它内置了延迟加载功能。您的手动收集方法需要锁定机制,如果您查看 ThreadLocal 的源代码,您会看到它针对这种特定情况进行了优化。

      【讨论】:

        【解决方案4】:

        ThreadLocal 可以在 T type object new 和 gc 频繁的时候得到好处。而且它是线程安全的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-25
          • 2013-08-22
          • 2016-07-04
          • 2011-03-13
          • 1970-01-01
          • 1970-01-01
          • 2011-09-27
          • 1970-01-01
          相关资源
          最近更新 更多