7

我注意到ThreadLocal<T>implements IDisposable,这意味着我应该在使用完线程局部变量后处理它。我只是好奇具体的问题是什么以及我应该小心做什么和/或避免做什么。

当线程退出时,线程的本地存储是否会被释放?如果我不处置我的 ThreadLocal 成员,最坏的情况是什么?

如果我有一个全局线程局部(矛盾修饰符?呵呵)变量(或者一个ThreadStatic变量)并且我在 ThreadPool 中的线程上分配这个值怎么办。我是否必须小心取消分配线程本地值,或者这不是问题?

4

1 回答 1

6

我不相信线程局部变量在存在时会被线程自动释放——这仍然留给开发人员来实现。来自 MSDN:

在释放对 ThreadLocal 的最后一个引用之前,请始终调用 Dispose。否则,在垃圾收集器调用 ThreadLocal 对象的 Finalize 方法之前,它正在使用的资源不会被释放。

但是,如果您的线程本地类型不消耗任何保证一次性的资源(例如 int 或其他原始类型),则可能不释放它,因为垃圾收集器最终会处理它。

让多个对象引用同一个对象实例通常是不明智的ThreadLocal——事实上,这违背了线程本地存储通常寻求实现的目标。可以假设隔离的线程局部变量是“线程安全的”——从某种意义上说,其他线程(原则上)不应该访问它们。请记住,线程安全是一个微妙的概念,需要您建立有关共享内存的特定约束和期望……我在此上下文中使用该术语是松散的。

于 2011-04-22T21:47:02.870 回答