java - 多线程中类加载器的行为

标签 java multithreading jvm classloader

如何理解

In a multi-threaded environment you might have type conversion exceptions due to different classloaders

我看到了Spring的源代码是这样的:

public static ClassLoader getDefaultClassLoader() {
    ClassLoader classLoader = null;
    try {
        classLoader = Thread.currentThread().getContextClassLoader();
    } catch (Throwable ex) {
        ex.printStackTrace();
    }
    if (classLoader == null) {
        // No thread context class loader -> use class loader of this class
        classLoader = ClassUtil.class.getClassLoader();
        if (classLoader == null) {
            // getClassLoader() returning null indicates the bootstrap ClassLoader
            try {
                classLoader = ClassLoader.getSystemClassLoader();
            } catch (Throwable ex) {

            }
        }
    }
    return classLoader;
}

我不明白为什么他们选择 Thread.currentThread().getContextClassLoader() 作为首选?

有人告诉我,因为类加载器的行为在多线程中可能会有所不同

说实话,我看不懂

最佳答案

Thread.currentThread().getContextClassLoader() 将是自然的首选,以便不同的上下文可以可靠地设置其私有(private)类加载器覆盖。虽然大多数情况下附加类加载器用于加载低级类加载器未提供的类,但另一种用途是在某些上下文中使用某些类的特定实现。

当这与类的类型标识包含加载该类的类加载器这一事实相结合时,可能会出现两个具有相同(绝对)类名但类型仍然不同的类。

关于java - 多线程中类加载器的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51799994/

相关文章:

java - 如何在保持线程安全的同时降低锁定粒度?

jvm - 尝试开始 JFR 记录时出现 AttachNotSupportedException

glassfish - Jolokia Java 客户端

Java - 我怎样才能让我的应用程序长期稳定运行,这样它就不会打嗝,卡住?

java - 如何处理单例java中的异常?

java - 无法使用 AM/PM 标记解析日期时间字符串

java - 查找项目源文件夹中特定扩展名的所有文件

multithreading - 如何将 "unlock"设为 RwLock?

java - 无法理解 volatile 字段的工作原理以及它们在共享值时如何与多个线程一起工作

java - 安装后"NDK version is UNKNOWN"