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

标签 java multithreading classloader

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

最佳答案

How unique is the thread context's classloader.

甚至远程也不行。

Is it reset everytime a thread is started?

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

Can we always be sure that 2 parallel threads will never have the same context classloader?

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

I see some frameworks like Axis relying on this to get and set run-time setting variables.

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

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

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

相关文章:

java - 在 JBOSS 中升级 Hibernate 版本

java - 学习NetBeans平台: annotations vs layer. xml文件

java - Google Maps API 上的 ZoomControls - 如何将它移动到 ButtonBar 上方?

java - JLabel 仅显示 initComponents() 是否被删除

java - JFrame 仅在首次创建时显示组件

multithreading - Linux内核是否处理多线程?

java - 在notifyAll()之后线程没有被唤醒;

java - WildFly 9.0.2 类加载问题

java - 反射和多个 jar

运行 R 代码时 Java 堆错误