Web应用程序中Java静态成员的范围

Bri*_*ian 7 java static

Java静态变量是否在同一Web应用程序的实例之间共享?

class MyClass
{
    private static SomeClass myStaticObject = new SomeClass();
}
Run Code Online (Sandbox Code Playgroud)

如果Web应用程序使用MyClass并且该应用程序的多个实例在Web服务器上运行,那么myStaticObject是否已多次初始化?

Vin*_*lds 9

通常,是的.大多数容器将为每个Web应用程序提供单独的类加载器.这将导致在多个应用程序使用时多次加载类,从而导致静态变量的多个实例.

说明Java语言规范以供参考:

在运行时,具有相同二进制名称的多个引用类型可以由不同的类加载器同时加载.这些类型可能代表也可能不代表相同的类型声明.即使两个这样的类型确实代表相同的类型声明,它们也被认为是不同的.

通过推理,将存在多个静态变量实例,除非这些类仅由父类加载器加载一次,并且永远不会被任何其他类加载器加载到其他位置.