为什么在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负责创建ThreadLocalMapThreadLocalMap为只有当第一电流线程创建ThreadLocal在这个线程设置,但在此之后同样ThreadLocalMap用于所有其他ThreadLocal变量。

    另一种方法是将ThreadLocalMap作为java.lang包中的独立包私有类来保存。 这样的选项没什么问题:这只是一个品味的问题,取决于开发人员需要更多的东西:将单个源文件中的相关功能分组,或保持源文件长度更小。

    链接地址: http://www.djcxy.com/p/92003.html

    上一篇: Why design ThreadLocalMap as static nest class in ThreadLocal?

    下一篇: Static nested class has full access to private outer class members?