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

kel*_*yfj 99 java multithreading

我在这里阅读ThreadDocal的JavaDoc

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadLocal.html

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

但我的问题是为什么他们选择让它静态(通常) - 它使得"每个线程"状态有点混乱,但字段是静态的?

Aff*_*ffe 121

因为如果它是一个实例级别字段,那么它实际上是"每个线程 - 每个实例",而不仅仅是一个保证的"每个线程".这通常不是您正在寻找的语义.

通常它会保存类似于用户对话,Web请求等对象的对象.您不希望它们也作为类的实例进行子作用域.
一个Web请求=>一个持久性会话.
没有一个Web请求=>每个对象一个持久性会话.

  • 每个实例的每个线程可以是一个有用的语义,但是对于该模式的大多数使用将涉及如此多的对象,最好使用"ThreadLocal"来保存对将对象映射到的哈希集的引用.线程实例. (4认同)
  • 我喜欢这个解释,因为它显示了如何使用ThreadLocal (2认同)

小智 15

要么使它成为静态,要么你试图避免类中的任何静态字段 - 使类本身成为单例,然后只要你有全局可用的单例,就可以安全地使用实例级ThreadLocal.


irr*_*ble 11

它不一定是.重要的是它应该是一个单身人士.