为什么在ThreadLocalMap中将ThreadLocal设计为静态类?而静态类和非静态嵌套类在下面有区别。
发布于 2016-01-14 04:04:15
首先,应该指出,ThreadLocalMap是一个包私有类,因此它不是API的一部分,而是一个实现细节,如果必要的话,这些细节在未来的JDK版本中可能会改变。
为什么不是非静态的?仅仅因为非静态嵌套类(内部类)绑定到外部类的具体实例。在我们的例子中,它应该绑定到具体的ThreadLocal变量。这是错误的:ThreadLocalMap被绑定到线程,并存储给定线程的所有ThreadLocal变量的所有值。因此,将其绑定到具体的ThreadLocal实例是毫无意义的。
也许让ThreadLocalMap成为Thread类的内部类看起来更符合逻辑。然而,ThreadLocalMap只是不需要Thread对象来操作,因此这只会增加一些不必要的开销。它位于ThreadLocal类中的原因是ThreadLocal负责创建ThreadLocalMap。只有在此线程中设置了第一个ThreadLocalMap时,才为当前线程创建ThreadLocal,但在此之后,对所有其他ThreadLocal变量使用相同的ThreadLocalMap。
另一种选择是将ThreadLocalMap保存为单独的包-- java.lang包中的私有类。这种选择没有什么问题:这只是品味问题,取决于开发人员更想要什么:将相关功能分组到单个源文件中,或者使源文件长度保持较小。
https://stackoverflow.com/questions/34781183
复制相似问题