我在日志记录类中定义了一个静态对象,大致如下:
class myLoggingClass {
static java.util.Properties properties;
...
...
}
根据我的参考书,这意味着属性对象由我的类的所有实例共享。
我觉得这个定义不够充分。我正在编写一个在我们项目的每个应用程序中多次调用的类。
此外,我们的项目使用在同一个 tomcat 容器中运行的多个 Web 服务。每个 Web 服务可能有多个线程。
运行在主机上的 Java 虚拟机还可以运行一个或多个 Web 服务客户端应用程序,这些应用程序在 tomcat 外部运行。
因此,根据这个定义,我可能让 tomcat 运行多个带有线程的 Web 服务,每个都有多个对象,这些对象可能包含我的类的一个实例。
也可能有一个或两个 Web 客户端在 tomcat 之外运行,但在同一个 JVM 中。我的类的所有这些实例会共享相同的属性对象吗?这将使它成为 JVM 范围的。
如果静态对象不是JVM 范围的,有谁知道每个对象会存在于哪个级别?每个 tomcat 容器一个?每个 Web 服务一个,每个独立 Web 服务客户端应用一个?
原因:当我更新我的属性时,我从 java.util.Properties 得到一个 java.lang.ConcurrentUpdateException。
当我的类更新它时,我使用静态布尔变量来“锁定”属性对象,但这并不能阻止异常的发生。
这使我相信我的类中使用的静态对象可能与 java.util.Properties 中使用的对象不在同一范围级别...但这只是一个猜测。
谢谢你的帮助。