Java thread.getContext()。getClassLoader()唯一性

时间:2017-12-07 13:24:49

标签: java multithreading classloader

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

1 个答案:

答案 0 :(得分:1)

  

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

甚至没有远程。

  

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

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

  

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

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

  

我看到像Axis这样的框架依赖于此来获取和设置运行时设置变量。

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

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