我遇到了一个奇怪的场景, 当我们初始化一个新对象并且对象数量是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!
是否有可能重新使用实例。?有没有人遇到过这种情况?
答案 0 :(得分:5)
没有。我想这是你的错误。也许还可以尝试使用不同的JVM版本或供应商,看看它们是否符合您的预期。
答案 1 :(得分:4)
这将构成JVM中的一个错误,但我认为这不太可能。
我敢肯定99%你的代码只是表现出竞争条件,例如你正在观察设置属性的线程以外的线程。
答案 2 :(得分:3)
对象不会被“重用”。您可以查看以下内容 -
注意: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)
如果您使用多线程,您可能会遇到所谓的“陈旧数据”
中解释