Java静态变量是否跨同一Web应用程序的实例共享?Web应用程序中Java静态成员的范围
class MyClass
{
private static SomeClass myStaticObject = new SomeClass();
}
如果Web应用程序使用MyClass的该应用程序的和多个实例是一个Web服务器上运行,是myStaticObject初始化多次?
Java静态变量是否跨同一Web应用程序的实例共享?Web应用程序中Java静态成员的范围
class MyClass
{
private static SomeClass myStaticObject = new SomeClass();
}
如果Web应用程序使用MyClass的该应用程序的和多个实例是一个Web服务器上运行,是myStaticObject初始化多次?
通常,是的。大多数容器将为每个Web应用程序提供单独的类加载器。这会导致该类在被多个应用程序使用时被多次加载,从而导致出现多个静态变量实例。
陈述Java Language Specification供参考:
在运行时,多个参考类型 具有相同二进制名称可以 同时由不同 类加载器加载。这些类型可能或可能不会代表 声明中的相同类型 。即使 这两种类型代表相同的类型声明, 它们也被认为是不同的。
通过推论,静态变量的多个实例将存在,除非这些类只能由父类加载器加载一次,并且不会由其他类加载器加载到别处。
我不完全明白MyClass
中有一个private static
变量。如果是private
,则不能从您定义的类的外部将它作为类变量访问。如果您只希望其他类通过getter方法访问此变量,则应删除static
关键字。
有很多使用“private static”变量的用例。其中之一就是保存下一个可用的对象ID。 –