1

Java の理論と実践から: Java メモリ モデルの修正、パート 2

The new JMM also seeks to provide a new guarantee of initialization safety -- that as long as an object is properly constructed (meaning that a reference to the object is not published before the constructor has completed), then all threads will see the values for its final fields that were set in its constructor, regardless of whether or not synchronization is used to pass the reference from one thread to another.

それでは、コンストラクターで初期化された非最終フィールドについてはどうですか? からa reference to the object is not published before the constructor has completed、動作は最終フィールドと同じであると結論付けることができました。それが正しいか?

4

2 に答える 2

3

この単純なクラスを見てください:

class Example {
    final int i;
    int j;
    Example() { i = 5; j = 5; }
}

構築中にオブジェクトへの参照は発行されないため、JMM は、新しく作成された Example のインスタンスにアクセスするすべての読み取りスレッドが .xml を参照することを保証しますi = 5。これは、インスタンスの公開方法に関係なく当てはまります。

ただし、インスタンスが安全に公開されていない場合、これらの同じスレッドはj = 0(つまり、デフォルト値) を参照する可能性があります。安全な出版イディオムは次のとおりです。

  • 静的初期化子からのインスタンスの初期化
  • インスタンスへの参照を揮発性としてマークする
  • インスタンスへの参照を最終としてマークする
  • すべてのアクセスの同期
于 2013-05-28T09:27:20.283 に答える
1
  • volatile 変数の場合、書き込みはすべてのスレッドからすぐに見えることが保証されます。これは、書き込みがコンストラクターで行われたかどうかに関係なく当てはまります。

  • 非揮発性変数の場合、書き込みは他のスレッドにすぐには表示されない場合があります。これは、書き込みがコンストラクターで行われたかどうかに関係なく当てはまります。

特殊なケースは最終フィールドです。オブジェクトの final フィールドへの書き込みは、コンストラクターが完了すると、すべてのスレッドから見えることが保証されます。

詳しくはこちらをご覧ください

于 2013-05-28T09:33:19.540 に答える