8

ダブルチェックロックについて質問があります。この例を考えてみましょう。

public class Singleton {

     private static volatile Singleton instance = null;

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

私が理解したように、上記のコードはシングルトンクラスを作成する正しい方法です。

ただし、NetBeansは外部のifステートメントを削除するように要求しているため、次のようになります。

public class Singleton {

     private static volatile Singleton instance = null;

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

これら2つのスニペットの唯一の違いは、2番目の例では、コードは常に同期ブロックに入り、最初の例では入りません。NetBeansをリッスンし、外部のifステートメントを削除するのはなぜですか?ロックを回避する方がよいはずです。

4

3 に答える 3

3

NetBeansの自動ヒントシステムは、これまでのように、を使用してダブルチェックロックを正しく実行できることを認識していないvolatileため、代わりに完全ロックを提案します。転ばぬ先の杖。ただし、この場合は、NetBeansではなく正しいです。

于 2011-12-07T09:37:09.483 に答える
3

ほとんどの場合、シングルトンが使用され、作成するのにそれほど費用がかからないので、単純にしてください。

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    public static Singleton getInstance() {
        return INSTANCE;
    }
    ...
}

本当に怠惰なインスタンス化が必要な場合は、静的内部クラスを使用してください。

public class Singleton {
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
    ...

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }
}
于 2011-12-07T09:40:16.937 に答える
0

この状況では、NetBeansをリッスンしないでください。最初のコードサンプルは正しいです。

于 2011-12-07T09:36:05.270 に答える