Java 为什么在ThreadLocal中将ThreadLocalMap设计为静态嵌套类?
为什么在Java 为什么在ThreadLocal中将ThreadLocalMap设计为静态嵌套类?,java,static,Java,Static,为什么在ThreadLocal中将ThreadLocalMap设计为静态类?而静态和非静态嵌套类的区别如下 嵌套的静态类不需要外部类的引用,但非静态嵌套类或内部类需要外部类引用 内部类(或非静态嵌套类)可以访问外部类的静态和非静态成员。静态类无法访问外部类的非静态成员。它只能访问外部类的静态成员 如果没有外部类的实例,则无法创建内部类的实例,并且内部类可以引用它所嵌套的外部类中定义的数据和方法,因此我们不需要将对象的引用传递给内部类的构造函数。由于这个原因,内部类可以使程序变得简单和简洁 首先需
ThreadLocal
中将ThreadLocalMap
设计为静态类?而静态和非静态嵌套类的区别如下
首先需要注意的是,
ThreadLocalMap
是一个包私有类,因此它不是API的一部分,而是一个实现细节,如有必要,在未来的JDK版本中可能会更改
为什么它不是非静态的?因为非静态嵌套类(内部类)绑定到外部类的具体实例。在我们的例子中,它应该绑定到具体的ThreadLocal
变量。这是错误的:ThreadLocalMap
绑定到线程,并存储给定线程的所有ThreadLocal
变量的所有值。因此,将其绑定到具体的ThreadLocal
实例是毫无意义的
也许让ThreadLocalMap
成为Thread
类的内部类看起来更符合逻辑。但是ThreadLocalMap
不需要Thread
对象来操作,因此这只会增加一些不必要的开销。它位于ThreadLocal
类内部的原因是ThreadLocal
负责ThreadLocalMap
的创建<仅当在此线程中设置了第一个ThreadLocal
时,才会为当前线程创建code>ThreadLocalMap,但在此之后,相同的ThreadLocalMap
将用于所有其他ThreadLocal
变量
另一种选择是将ThreadLocalMap
作为java.lang
包中的单独包私有类保存。这样的选择没有错:这只是一个品味的问题,取决于开发人员更想要什么:在单个源文件中分组相关功能,或者保持源文件长度更小