1. ホーム
  2. java

[解決済み] 二重チェックロックでvolatileを使用する理由

2023-08-08 19:30:34

質問

から ヘッドファースト のデザインパターン集から、二重チェックロックを用いたシングルトンパターンを以下に実装しました。

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

なぜ volatile が使われているのか理解できません。そうではなく volatile を使用することは、二重チェックロックを使用する目的、すなわちパフォーマンスを低下させませんか?

どのように解決するのですか?

なぜそうなるのかを理解するための良い資料です。 volatile が必要なのかを理解するための良い資料となります。 JCIP の本からです。ウィキペディアには まともな説明 があり、その資料もあります。

本当に問題なのは Thread A に対してメモリ空間を割り当てることができます。 instance を構築する前に instance . Thread B はその割り当てを見て、それを使おうとします。この結果 Thread B が失敗することになります。 instance .