2011-06-17 38 views
6

Java静态变量是否跨同一Web应用程序的实例共享?Web应用程序中Java静态成员的范围

class MyClass 
{ 
    private static SomeClass myStaticObject = new SomeClass(); 
} 

如果Web应用程序使用MyClass的该应用程序的和多个实例是一个Web服务器上运行,是myStaticObject初始化多次?

回答

8

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

陈述Java Language Specification供参考:

在运行时,多个参考类型 具有相同二进制名称可以 同时由不同 类加载器加载。这些类型可能或可能不会代表 声明中的相同类型 。即使 这两种类型代表相同的类型声明, 它们也被认为是不同的。

通过推论,静态变量的多个实例将存在,除非这些类只能由父类加载器加载一次,并且不会由其他类加载器加载到别处。

-1

我不完全明白MyClass中有一个private static变量。如果是private,则不能从您定义的类的外部将它作为类变量访问。如果您只希望其他类通过getter方法访问此变量,则应删除static关键字。

+3

有很多使用“private static”变量的用例。其中之一就是保存下一个可用的对象ID。 –