为什么 Java ThreadLocal 变量应该是静态的

2022-08-31 09:29:58

我在这里阅读了 Threadlocal 的 JavaDoc

https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html

它说“ThreadLocal实例通常是希望将状态与线程(例如,用户ID或事务ID)相关联的类中的私有静态字段。

但我的问题是,为什么他们选择将其设置为静态(通常) - 使事情变得有点混乱,因为具有“每个线程”状态,但字段是静态的?


答案 1

因为如果它是实例级字段,那么它实际上是“每线程 - 每个实例”,而不仅仅是保证的“每线程”。这通常不是您要查找的语义。

通常,它包含一些类似于对象的东西,这些对象的作用域为用户对话,Web请求等。您不希望它们也限定为类的实例。
一个 Web 请求 = >一个持久性会话。
没有一个 Web 请求 = 每个对象>一个持久性会话。


答案 2

要么让它成为静态的,要么如果你试图避免类中的任何静态字段 - 使类本身成为单例,然后你可以安全地使用实例级 ThreadLocal,只要你有该单一实例在全局范围内可用。