线程上下文的类加载器有多独特。每次启动线程时都会重置吗?
我们能否始终确保2个并行线程永远不会具有相同的上下文类加载器?
我看到像Axis这样的一些框架依靠它来获取和设置运行时设置变量。

最佳答案

线程上下文的类加载器有多独特。


甚至不是遥远的。


  每次启动线程时都会重置吗?


创建线程时,它没有可以重置的上下文加载器。它将继承父线程的上下文加载器。启动线程不会更改其上下文加载器。


  我们能否始终确保2个并行线程永远不会具有相同的上下文类加载器?


这实际上是非常不可能的。如前所述,线程默认情况下会继承父级的加载程序,因此,除非有人用不同的加载程序显式调用setContextClassLoader,否则所有线程都将使用ClassLoader.getSystemClassLoader()返回的默认应用程序类加载程序。即使在具有不同类加载器的环境中,也不太可能拥有与线程一样多的类加载器。


  我看到像Axis这样的一些框架依靠它来获取和设置运行时设置变量。


这是功能的主要用途,按惯例使用当前线程的上下文类加载器的框架,但是,当然,用于加载类和资源,而不是假设这些加载器的唯一性。 JVM从不单独使用此上下文类加载器,因为在类中找到的符号引用是通过该类的定义类加载器来解析的。 Class.forName(String)也是如此(没有类加载器参数)。它要求代码主动调用getContextClassLoader()并使用返回的加载器进行类加载,以使此功能相关。

不要将类加载器与ThreadLocal变量混淆。

关于java - Java thread.getContext()。getClassLoader()唯一性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47696158/

10-12 13:28