- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在我的日志记录类中定义了一个静态对象,大致如下:
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/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to nest OR statements in JavaScript? 有没有办法做到这一点:
在 JavaScript 中有没有办法让一个变量总是等于一个变量?喜欢var1 = var2但是当var2更新,也是var1 . 例子 var var1 = document.getElementBy
我正在努力理解这代表什么 var1 = var2 == var3 我的猜测是这等同于: if (var2 == var3): var1 = var2 最佳答案 赋值 var1 = var2
这个问题已经有答案了: What does the PHP error message "Notice: Use of undefined constant" mean? (2 个回答) 已关闭 8
我在临时表中有几条记录,我想从每条记录中获取一个值并将其添加到一个变量中,例如 color | caption -------------------------------- re
如何将字符串转为变量(字符串变量--> $variable)? 或者用逗号分隔的变量列表然后转换为实际变量。 我有 2 个文件: 列名文件 行文件 我需要根据字符串匹配行文件中的整行,并根据列名文件命
我有一个我无法解决的基本 php 问题,我也想了解为什么! $upperValueCB = 10; $passNodeMatrixSource = 'CB'; $topValue= '$uppe
这可能吗? php $variable = $variable1 || $variable2? 如果 $variable1 为空则使用 $variable2 是否存在类似的东西? 最佳答案 PHP 5
在 Perl 5.20 中,for 循环似乎能够修改模块作用域的变量,但不能修改父作用域中的词法变量。 #!/usr/bin/env perl use strict; use warnings; ou
为什么这不起作用: var variable; variable = variable.concat(variable2); $('#lunk').append(variable) 我无法弄清楚这一点
根据我的理解,在32位机器上,指针的sizeof是32位(4字节),而在64位机器上,它是8字节。无论它们指向什么数据类型,它们都有固定的大小。我的计算机在 64 位上运行,但是当我打印包含 * 的大
例如: int a = 10; a += 1.5; 这运行得很完美,但是 a = a+1.5; 此作业表示类型不匹配:无法从 double 转换为 int。所以我的问题是:+= 运算符 和= 运算符
您好,我写了这个 MySQL 存储过程,但我一直收到这个语法错误 #1064 - You have an error in your SQL syntax; check the manual that
我试图在我的场景中显示特定的奖牌,这取决于你的高分是基于关卡的目标。 // Get Medal Colour if levelHighscore goalScore { sc
我必须维护相当古老的 Visual C++ 源代码的大型代码库。我发现代码如下: bIsOk = !!m_ptr->isOpen(some Parameters) bIsOk的数据类型是bool,is
我有一个从 MySQL 数据库中提取的动态产品列表。在 list 上有一个立即联系 按钮,我正在使用一个 jquery Modal 脚本,它会弹出一个表单。 我的问题是尝试将产品信息变量传递给该弹出窗
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
jQuery Core Style Guidelines建议两种不同的方法来检查变量是否已定义。 全局变量:typeof variable === "undefined" 局部变量:variable
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: “Variable” Variables in Javascript? 我想肯定有一种方法可以在 JavaScrip
在语句中使用多重赋值有什么优点或缺点吗?在简单的例子中 var1 = var2 = true; 赋值是从右到左的(我相信 C# 中的所有赋值都是如此,而且可能是 Java,尽管我没有检查后者)。但是,
我是一名优秀的程序员,十分优秀!