静态成员在新生成的线程中 null

Static member is in new spawned thread null

我有一个非常奇怪的行为,这不可能,代码是如何写在 java 中的。 设置了静态成员,并且在新生成的线程中该成员为空。 两个断点之间没有修改成员。

在另一个 linux 服务器上运行没有问题,可能是 jvm 错误或某些操作系统错误?

这不是竞争条件,因为另一个线程是在设置成员后产生的。

详情:

Red Hat Enterprise Linux 服务器版本 7.7

Tomcat 7.0.108

OpenJDK 64 位服务器虚拟机 11.0.9.1

即使在同一个 JVM 进程中,由于 classloader,class 也可以存在多次。一个 class 可能会被多个 class 加载器加载,因此你可能 运行 遇到类似 ClassCastExceptions 声明 A cannot be cast to A 的情况,这表明两个 class 都命名为 A 由不同的 classloader 加载。

多个 classloader 可以在许多应用程序中使用,但应用程序服务器是一个突出的例子,例如由于 Web 应用程序需要相互隔离,因此不能访问彼此的 classes.

也就是说,看看你的线程堆栈,第一行是:

owns Class<T> (org.eclipse.equinox.servletbridge.BridgeServlet) (id=xx)

但在这两种情况下,id(应该是 Class 实例的 id)不同:30 和 121

因此您使用了 2 个不同的 BridgeServlet.class 实例(由不同的 classloader 加载),因此您多次拥有相同的静态字段。