0

このリンクでは以下のようにシングルトンのインスタンス化を見つけました:

public static Singleton getInstanceDC() {
        if (_instance == null) {                // Single Checked (1)
            synchronized (Singleton.class) {
                if (_instance == null) {        // Double checked
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
}

私は単一のチェック、つまり (1) のポイントを得ていません。ここで、単一のスレッドが同期ブロック内のインスタンスをチェックする方法は何ですか?最初のチェックを使用するポイントは何ですか?

4

1 に答える 1

3

マルチスレッド環境では、2 つのスレッドがシングルトンにアクセスできることを考慮してください。ダブルチェックなしで起こり得ることは次のとおりです。

最初のスレッドが入りgetInstanceDC()ます。ブロック_instancenull入るそうです。if2 番目のスレッドが入りgetInstanceDC()ます。ブロック_instancenull入るそうです。if最初のスレッドが新しいインスタンスを作成します。2 番目のスレッドが新しいインスタンスを作成します。

この問題は、同期ブロックでのダブル チェックによって解決されます。

では、メソッド全体を同期してみませんか? 答えはパフォーマンス上の理由です。

于 2015-03-16T16:53:48.530 に答える