2009-06-05 13 views
0

私は奇妙なシナリオに遭遇しています 新しいオブジェクトを初期化するときにJVMがJVmを再利用する可能性はありますか?JVM、Java、マルチスレッド、オブジェクト作成

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! 

インスタンスが再利用される可能性はありますか?誰もこのシナリオを前にしていますか?

+1

は、我々はより多くのコードを見ることができます?ローカル変数かフィールドですか? setAttributeとgetAttributeの外観はどうですか? (メソッドのシグネチャ、コンテンツ、フィールドの宣言の両方) – Yishai

答えて

5

いいえ、これはあなたのバグだと思います。多分、別のJVMのバージョンやベンダーで期待通りの動作をするかどうかを試してみてください。

+0

これは私が今テストしているものである可能性があります – hakish

4

これはJVMのバグを構成しますが、私は非常にそうは考えていません。

あなたのコードは、その属性の設定を観察しているスレッド以外のスレッドのような競合状態を単に示していると私は信じています。

3

オブジェクトは再利用されません。以下を確認できます -

  • OutOfMemoryErrorを取得していますか?はいの場合、プログラムは不整合な状態になる可能性があります
  • 他のスレッドがあなたの 'a'オブジェクトを変更していないことは確かですか?

注:gidの修正後の回答が更新されました。

+0

スレッドのたびにインスタンスが作成されます! – hakish

+0

「JVMあなたのプログラムは矛盾した状態になる可能性がありますが、JVMの状態はちょうど良いはずです。 –

+0

@gid:それを指摘してくれてありがとう - それは私が元来意図したものです。 – talonx

3

JVMはではありません。 AFAIKオブジェクトを再作成します。しかし、あなたが見ている行動を説明することができます。

a.setAttribute("aaaa");およびa.getAttributeは、別のクラスの静的フィールド、シングルトンまたはスレッドローカルを設定している可能性があります。

+0

その静的オブジェクトまたはシングルトンオブジェクトではありません。 – hakish

0

あなたは「古いデータ」として知られているものを

に遭遇するかもしれないマルチスレッドを使用している場合は、それのいくつかは、これらの割り当ては、プログラム文の並べ替えを発揮することができる置く取る場所に応じてJava multi-threading & Safe Publication

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

関連する問題