0

我遇到了一个奇怪的场景,当我们初始化一个新对象并且对象计数是 JVM 非常高时,是否有可能 JVM 重新使用已经创建的对象?

abc a = new abc();
a.setAttribute("aaaa");
.........
a...is no longer being used...and has not yet been garbage collected by the JVM. There are multiple threads creating 5000 instances of class abc..
again, abc a = new abc();
       Sysout(a.getAttribute()); // This prints "aaaa" set for an earlier instance! 

是否有可能重复使用实例。?有没有人遇到过这种情况?

4

6 回答 6

5

不,我认为这是你的错误。也许还可以尝试使用不同的 JVM 版本或供应商,看看它们的行为是否符合您的预期。

于 2009-06-05T11:28:10.967 回答
4

这将构成 JVM 中的错误,但我认为这不太可能。

我会以 99% 的信心说,您的代码只是表现出一种竞争条件,例如一个线程,而不是您正在观察设置属性的线程。

于 2009-06-05T11:30:41.493 回答
3

对象不会被“重用”。您可以检查以下内容 -

  • 你得到一个 OutOfMemoryError 吗?如果是,程序可能处于不一致状态
  • 您确定其他线程没有修改您的“a”对象吗?

注意:在 gid 纠正我之后更新了答案。

于 2009-06-05T11:36:18.953 回答
3

JVM 不会重新处理对象 AFAIK。但是你看到的行为是可以解释的。

a.setAttribute("aaaa");并且a.getAttribute可能正在另一个类中设置静态字段、单例或线程本地,或者另一个线程正在更改状态。

于 2009-06-05T11:40:56.137 回答
1

根据这些赋值发生的位置,您的程序可能会出现语句重新排序:JVM 可能正在对赋值语句进行指令重新排序,因此它们不会按照您编写它们的顺序执行。这是内存模型规范的一部分,可能表明您的程序正在同步。

请参阅 JSR133 常见问题解答: http ://www.cs.umd.edu/users/pugh/java/memoryModel/jsr-133-faq.html#reordering

或第 2 节: http ://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf

此视频的 10:40 开始更简单的解释: http ://www.youtube.com/watch?v=1FX4zco0ziY

于 2009-06-05T12:18:16.593 回答
0

如果您使用的是多线程,您可能会遇到所谓的“陈旧数据”

其中一些在Java multi-threading & Safe Publication中进行了解释

于 2009-06-05T11:49:56.337 回答