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 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

于 2009-06-05T12:18:16.593 に答える
0

マルチスレッドを使用している場合、「古いデータ」と呼ばれるものに遭遇する可能性があります

その一部はJava multithreading & Safe Publicationで説明されています

于 2009-06-05T11:49:56.337 に答える