これは、 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 に割り当てられる可能性はありますか?
ありがとう、リッチ