2

これは、 Java 二重チェック ロックからのフォローアップです。

次のコード スニペットには、2 つの興味深い特徴があります。

1) オブジェクトを使用する準備が整う前に、別の init() メソッドを呼び出す必要があります。そのため、volatile は役に立ちません (わかっています。コードを単に init() のコンストラクターに入れてみませんか?説明のためにここに示しています)。

2) tmp 変数を使用して初期化を行い、初期化の完了後にインスタンスに割り当てます。

if (instance == null) {
synchronized (mutex) {
    if (instance == null) {
        AClass tmpInstance = new AClass();
        tmpInstance.init();
        instance = tmpInstance;
    }
}
}

では、これは並べ替えの問題の影響を受けますか。つまり、インスタンスが tmpInstance.init() が呼び出される前に tmpInstance に割り当てられる可能性はありますか?

ありがとう、リッチ

4

2 に答える 2

2

instance重要なのは、すべての初期化が完了した後、最後の操作としてに割り当てていることだけです。(できれば) 揮発性であるためinstance、これにより、すべての初期化が後のリーダーに確実に表示されます。

ところで、許可された並べ替えのすべてのルールを学習する必要は実際にはありません。これは、JIT コンパイラの実装者のみが読む必要があります。

Java プログラマーとして覚えておく必要があるのは、Java メモリ モデルが提供する 2 つの単純な保証 (1 つは についてsynchronized、もう 1 つは についてvolatile) だけです。JMM の書き直し (JLS 3 以降) の要点は、非常に単純な同時実行モデルに対してプログラミングできるようにすることでした。

于 2013-08-02T17:58:10.327 に答える
1

では、これは並べ替えの問題の影響を受けますか。つまり、インスタンスが tmpInstance.init() が呼び出される前に tmpInstance に割り当てられる可能性はありますか?

いいえ、それは volatile が解決する可視性の問題の影響を受けます。instanceしたがって、引き続きvolatile を宣言する必要があります。

ここで、再注文の対象にならない理由を説明します。通常店舗はモニター入場後の再注文はできません。

http://g.oswego.edu/dl/jmm/cookbook.html

1回目の操作:MonitorEnter

2 番目の操作: NormalStore

再注文できます: いいえ

于 2013-08-02T17:57:41.253 に答える