gpt4 book ai didi

java - Java 中静态类变量的作用域

转载 作者:搜寻专家 更新时间:2023-10-30 21:01:25 25 4
gpt4 key购买 nike

我在我的日志记录类中定义了一个静态对象,大致如下:

   class myLoggingClass {
static java.util.Properties properties;
...
...
}

根据我的引用书,这意味着属性对象由我的类的所有实例共享。

我觉得这个定义不够充分。我正在编写一个在我们项目的每个应用程序中被多次调用的类。

此外,我们的项目使用在同一个 tomcat 容器中运行的多个 Web 服务。每个网络服务可能有多个线程。

在主机上运行的 Java 虚拟机也可以运行一个或多个 Web 服务客户端应用程序,这些应用程序在 tomcat 外部运行。

所以根据这个定义,我可能让 tomcat 运行多个带有线程的 Web 服务,每个线程都有几个对象,这些对象可能包含我的类的一个实例。

也可能有一个或两个 Web 客户端在 tomcat 之外运行,但在同一个 JVM 中。我的类的所有实例是否共享相同的属性对象?这将使它在 JVM 范围内。

如果静态对象不是 JVM 范围的,有谁知道每个对象存在于哪个级别?每个 tomcat 容器一个?每个 Web 服务一个,每个独立的 Web 服务客户端应用程序一个?

原因:当我更新我的属性时,我从 java.util.Properties 得到一个 java.lang.ConcurrentUpdateException。

当我的类更新它时,我正在使用一个静态 boolean 变量来“锁定”属性对象,但这并不能阻止异常的发生。

这让我相信我的类中使用的静态对象可能与 java.util.Properties 中使用的静态对象不在同一范围级别...但这只是一个猜测。

感谢您的帮助。

最佳答案

静态不是“由类的所有实例共享”——它们与实例无关;它们属于类型本身。特别是,静态变量无需创建任何实例即可完美使用。

这提供了有关静态范围的线索:它们由代表包含类的 Class 对象限定范围,而后者又由 ClassLoader 限定范围加载它。

根据放置库的位置,静态变量可能是 JVM 范围的或 Web 应用程序范围的 - 或者可能介于两者之间,如果 Tomcat 支持多主机(我不记得了)。

查看 Tomcat 文档,了解库的布局方式以及它们与类加载器的关系。例如,这里是 Tomcat 6.0 ClassLoader how-to guide , 和 the equivalent for 5.5 .

您的 boolean “锁”是如何工作的?您确实应该使用适当的锁 (synchronized) 以确保属性对象的每次使用(读取和写入,包括在您循环访问它的整个期间锁定)都被适本地锁定。

您是否考虑过将其视为不可变的,而不是更改“实时”Properties 对象 - 因此当您想要更新属性时,您获取一个副本,更改它,然后制作副本“现场”版本?您仍然需要防止两个不同的线程同时进行更改(否则您会丢失一些),但这可能会使读取端更容易、更高效。

关于java - Java 中静态类变量的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1402034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com