为什么将ThreadLocalMap设计为ThreadLocal中的静态嵌套类?

时间:2016-01-14 03:25:10

标签: java static

为什么在ThreadLocalMap中将ThreadLocal设计为静态类?虽然静态和非静态嵌套类具有以下差异。

  1. 嵌套静态类不需要引用外部类,但非静态嵌套类或内部类需要外部类引用。

  2. 内部类(或非静态嵌套类)可以访问外部类的静态和非静态成员。静态类无法访问外部类的非静态成员。它只能访问外部类的静态成员。

  3. 如果没有外部类的实例,则无法创建Inner类的实例,而Inner类可以引用它所嵌套的外部类中定义的数据和方法,因此我们不需要传递对象的引用到Inner类的构造函数。因此,内部课程可以使程序简单明了。

1 个答案:

答案 0 :(得分:0)

首先应该注意ThreadLocalMap是一个包私有类,因此它不是API的一部分,而是一个实现细节,如果需要,可能会在将来的JDK版本中更改。

为什么它不是非静态的?仅仅因为非静态嵌套类(内部类)绑定到外部类的具体实例。在我们的例子中,它应该绑定到具体的ThreadLocal变量。这是错误的:ThreadLocalMap与线程有界,并存储给定线程的所有ThreadLocal变量的所有值。因此将它绑定到具体的ThreadLocal实例是没有意义的。

ThreadLocalMap类的内部类设为Thread可能更合乎逻辑。但是ThreadLocalMap只是不需要Thread对象来操作,所以这只会增加一些不必要的开销。它位于ThreadLocal类内的原因是ThreadLocal负责创建ThreadLocalMap。仅当在此线程中设置了第一个ThreadLocalMap时,才为当前线程创建ThreadLocal,但在此之后,所有其他ThreadLocalMap变量使用相同的ThreadLocal

另一种方法是将ThreadLocalMap作为java.lang包中的单独的包私有类。这样的选择没有错:它只是一个品味的问题,取决于开发人员想要的更多:在单个源文件中分组相关功能或保持较小的源文件长度。