-1

キーワードstaticvolatileJava に慣れ始めています。私が構築しているシングルトン クラスに関して、次のようなデザインが表示されるのはなぜですか?

public class Singleton{
    private static volatile Singleton _instance; 

    public static Singleton getInstance(){

       if(_instance == null){
           synchronized(Singleton.class){
               if(_instance == null)
                   _instance = new Singleton();
           }

       }
       return _instance;

    }
}

これの代わりに?

public class Singleton{ 
    private static volatile Singleton _instance = new Singleton();

    public static Singleton getInstance(){
        return _instance;
    }
}

最初の設計は 2 番目の設計よりも利点がありますか? 私が見ることができる唯一の利点は、2 番目の設計がメソッド全体を同期することです。これには、メソッド全体のブロックが必要になる場合があります。しかし、それに対する私の反論は、メソッドは1行だけで、目立ってブロックすることはないということですよね?

4

3 に答える 3

2

コメントを追加したかったのですが、まだ許可されていないようです。

最初の例はダブルチェック ロックで、Java ではもう壊れていません。

J2SE 5.0 では、この問題は修正されています。volatile キーワードにより、複数のスレッドがシングルトン インスタンスを正しく処理できるようになりました。~ http://en.wikipedia.org/wiki/Double-checked_locking

ダブルチェック ロックの考え方は、必要になるまでシングルトン オブジェクトの作成を保留し、できるだけ同期をとらずにオブジェクトをロックすることです。

2 番目の例では、使用されたかどうかに関係なく、クラスがロードされるとすぐに (おそらく起動時に) シングルトンが作成されます。

どちらの例もスレッドセーフであり、J2SE 5.0 では完全に使用可能です。それは、シングルトンオブジェクトを作成するコストを取りたいかどうかに依存し、使用されることのないオブジェクトをメモリに保持する天候は許容されます。

于 2013-06-13T17:58:21.123 に答える
0

実際には、2 番目のものは「遅延」初期化を実行するため、クラスのインスタンス化に時間がかかり、アプリケーションでこのクラスのインスタンスが必要かどうかわからない場合に備えてください。この場合、「オンデマンド」でインスタンスを作成できます。マルチスレッド環境によると、両方の設計はスレッドセーフです。

于 2013-06-13T17:39:42.123 に答える