0

これは、オブジェクトが初期化中に他のスレッドに表示される場合(初期化の実行中に表示されるが、まだ完了していない場合)に可能ですか?もしそうなら、あなたはあなたの正当性をバックアップするための簡単な例を挙げていただけますか?

4

2 に答える 2

5

これは、さまざまな方法で発生する可能性があります。

  • コンストラクターでオブジェクトを別のスレッドに渡します。たとえば、コンストラクターでスレッドを開始します。
  • オブジェクトを別のスレッドに渡しますが、フィールドが final または volatile ではないか、ロックされたブロックまたは同期されたブロックでアクセスされないため、他のスレッドには初期化されていない古い値が表示されます。その他のフィールドは、スレッド セーフであることが保証されていません。
于 2012-08-18T08:31:18.773 に答える
2

適切な最良のケースは、悪名高い壊れたダブルチェックのロックイディオムです。この議論に関係する部分だけを抜粋します。次のコードを使用します。

public class Holder { public static File f; }

スレッド A のどこかで行いHolder.f = new File("path");、スレッド B の他の場所で行いFile xxf = Holder.f;、それを使用します。への参照を読んでもHolder.f、インスタンスの任意のフィールドがFile任意の定義済み状態になるという保証はありません。すべての null (タイプに応じてゼロ、false)、または非 null 値と null 値の異常な組み合わせを読み取ることができます。

于 2012-08-18T08:55:47.827 に答える