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