JVM,Java,多线程,对象创建

时间:2009-06-05 11:21:23

标签: java multithreading object jvm creation

我遇到了一个奇怪的场景, 当我们初始化一个新对象并且对象数量是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! 

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

我敢肯定99%你的代码只是表现出竞争条件,例如你正在观察设置属性的线程以外的线程。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

JVM 重新对象AFAIK。但是你可以解释你所看到的行为。

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

答案 4 :(得分:1)

根据这些分配的位置,您的程序可能会展示语句重新排序:JVM可能会对赋值语句进行指令重新排序,因此它们不会按您编码的顺序执行。这是内存模型规范的一部分,可能指向您的程序处于同步状态。

参见JSR133 FAQ: 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

答案 5 :(得分:0)

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

其中一些内容在Java multi-threading & Safe Publication

中解释