Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程上下文类加载器是否可以为null?_Java_Multithreading - Fatal编程技术网

Java 线程上下文类加载器是否可以为null?

Java 线程上下文类加载器是否可以为null?,java,multithreading,Java,Multithreading,我不完全确定我是如何做到这一点的,但不知何故,我从Thread.getContextClassLoader得到了一个空类加载器。在读了一点(文档中或google上没有太多信息)之后,我得到了这样的印象:当前线程有一个空类加载器是有效的,并且应该检查对getContextClassLoader的调用是否有空引用 这是非常令人惊讶的,因为我已经看到了对getContextClassLoader的几个未经检查的开源项目调用(这让我首先检查了这一点)。具体而言,这一行包括: (我刚刚验证了log4j也没

我不完全确定我是如何做到这一点的,但不知何故,我从Thread.getContextClassLoader得到了一个空类加载器。在读了一点(文档中或google上没有太多信息)之后,我得到了这样的印象:当前线程有一个空类加载器是有效的,并且应该检查对getContextClassLoader的调用是否有空引用

这是非常令人惊讶的,因为我已经看到了对getContextClassLoader的几个未经检查的开源项目调用(这让我首先检查了这一点)。具体而言,这一行包括:

(我刚刚验证了log4j也没有检查)


那么,对getContextClassLoader的调用应该检查空引用还是我的线程出了问题?

对于
Thread.getContextClassLoader
返回
null
是非常有效的。并不是所有的软件质量都特别好

虽然
null
类加载器
通常指加载系统类的引导类加载器(我认为这是对的,术语由于历史原因被弄乱了),但对于线程上下文类加载器,它通常被解释为未设置,而使用系统类加载器

IIRC,如果使用
java
命令,线程上下文类加载器被设置为主线程的系统类加载器。对于小程序,小程序线程和EDT将其设置为小程序类加载器

我建议不要使用线程上下文类加载器(或大多数其他线程局部变量),除非上下文需要它。

As,它对于
thread.getContextClassLoader()
返回
null
是完全有效的。我隐约记得默认行为随着时间的推移已经发生了变化(或者在不同的JVM供应商实现中可能有所不同——我记不起来了)

假设一个非空的上下文
ClassLoader
可能是有效的,如果您已经在堆栈上进一步设置了一个上下文,并且其间没有外来代码,或者如果类/库契约需要一个


作为旁注,也可以返回
null

您是否知道当本机线程连接到JVM时,上下文类加载器是否自动修复?我不确定我是如何达到上下文类加载器为空的程度的,因为到目前为止一切都正常。当创建
线程时,它继承了当前
thread
@Idan K的线程上下文类加载器,那么我想没有一个当前线程可以从中继承任何东西-我不知道这在JNI中是如何实现的(似乎忽略了构造函数,因为它们会NPE(显然第一个线程不能有父线程))。