为什么Java的ThreadLocalvariables是静态的

我在这里阅读JavaDoc for Threadlocal

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

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

但是我的问题是,为什么他们select将其设置为静态(通常) – 这使得“每个线程”状态有点混乱,但是这些字段是静态的?

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

通常它包含的东西类似于用户对话,Web请求等的对象。您不希望它们也被子类别化为类的实例。
一个Web请求=>一个持久会话。
没有一个Web请求=>每个对象一个持久会话。

要么是静态的,要么是试图避免你的类中的任何静态字段 – 让这个类本身成为一个单例,然后你可以安全地使用一个实例级的ThreadLocal,只要你有这个单例可用于全局。

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

原因是variables是通过与线程相关的指针来访问的。 它们像线程范围的全局variables一样,因此静态是最合适的。 这是你在pthreads之类的东西中获得线程本地状态的方式,所以这可能只是历史和实现的一个意外。

每个线程对每个实例的threadlocal用法是,如果您希望在某个对象的所有方法中都可以看到某些内容,并且让它在不同步访问的情况下是线程安全的,就像对于一个普通的字段那样。