为什么在ThreadLocal中将ThreadLocalMap设计为静态嵌套类?
为什么设计ThreadLocalMap
作为静态类中ThreadLocal
? 虽然静态和非静态嵌套类在下面有差异。
嵌套静态类不需要Outer类的引用,但非静态嵌套类或Inner类需要Outer类引用。
内部类(或非静态嵌套类)可以访问Outer类的静态和非静态成员。 静态类不能访问Outer类的非静态成员。 它只能访问Outer类的静态成员。
如果没有外部类的实例,并且Inner类可以引用在其嵌套的Outer类中定义的数据和方法,则不能创建Inner类的实例,因此我们不需要将对象的引用传递给Inner的构造函数类。 出于这个原因,内部类可以使程序简单而简洁。
首先应该注意的是, ThreadLocalMap
是一个包私有类,因此它不是API的一部分,而是一个实现细节,如果需要,它可能在未来的JDK版本中发生变化。
为什么它不是非静态的? 仅仅因为非静态嵌套类(内部类)被绑定到外部类的具体实例。 在我们的例子中,它应该绑定到具体的ThreadLocal
变量。 这是错误的: ThreadLocalMap
绑定到线程并存储给定线程的所有ThreadLocal
变量的所有值。 因此将它绑定到具体的ThreadLocal
实例是没有意义的。
也许让ThreadLocalMap
成为Thread
类的内部类看起来更合乎逻辑。 然而, ThreadLocalMap
只是不需要Thread
对象来操作,所以这只会增加一些不必要的开销。 它位于ThreadLocal
类中的原因是ThreadLocal
负责创建ThreadLocalMap
。 ThreadLocalMap
为只有当第一电流线程创建ThreadLocal
在这个线程设置,但在此之后同样ThreadLocalMap
用于所有其他ThreadLocal
变量。
另一种方法是将ThreadLocalMap
作为java.lang
包中的独立包私有类来保存。 这样的选项没什么问题:这只是一个品味的问题,取决于开发人员需要更多的东西:将单个源文件中的相关功能分组,或保持源文件长度更小。
上一篇: Why design ThreadLocalMap as static nest class in ThreadLocal?
下一篇: Static nested class has full access to private outer class members?