参考我之前的问题,更进一步,
- 与局部变量相比,使用 ThreadLocals 的缺点是什么
- 它们是如何实施的
- 会话变量是 ThreadLocals
- 是否有更多常用的ThreadLocals的例子
参考我之前的问题,更进一步,
我不确定我是否会称其为缺点,但必须非常小心地正确清理 ThreadLocals,因为只要线程存在,您放入的任何数据都会保留在那里,除非它被明确删除。这在使用线程池重用线程的环境中尤其麻烦,因此一些垃圾数据可能会附加到线程,除非它被正确清理。
ThreadLocals 实际上被大量使用 - 主要由框架开发人员使用,因为它们允许将“上下文”附加到用户方法而不更改方法签名。例如,J2EE 中的事务管理是使用 ThreadLocals 完成的——对当前打开事务的引用始终附加到线程,因此当您使用数据库时,您将使用当前打开的事务自动访问它。如果没有 ThreadLocal,您将需要将这些引用作为方法参数传递。
这种用法还有许多其他示例。我不确定您指的是哪些会话变量,但类似会话的数据通常附加到 ThreadLocal。
关于实施 - 我不确定。我想我在某处读到它是在 JVM 中以相当低的级别实现的,以使性能非常快,因为今天有很多代码使用它。
Map<Thread,Value>
- 它实际上是一个附加到线程的映射,但更容易将其视为由线程键入的映射在我看来,应用程序开发人员使用 ThreadLocal 的唯一原因是他/她需要频繁使用具有(相对)高构造成本的非线程安全实用程序对象(例如 SimpleDateFormat)。即便如此,这也是一个折腾。