1

これは例です:

http://www.tutorialspoint.com/java/java_using_singleton.htm

最初の例を見ると、ユーザーが :Singleton.getInstance()と書くと、次のように呼び出されます。

new Singleton()

毎回新しいシングルトンオブジェクトを作成するとき、それがどのようにシングルトンなのかわかりませんか?

2番目の例は理解できました。nullの場合singleton、新しいオブジェクトを作成しますが、最初の例では、常に新しいオブジェクトを作成します??

どうしたの?

4

5 に答える 5

10

いいえ、最初の例では、への唯一の呼び出しnew Singleton()はここ(内Singleton)です:

private static Singleton singleton = new Singleton( );

これは静的変数の初期化子です。一度だけ実行され、必要な場合にのみ実行されます。(クラスに触れたことがない場合Singleton、初期化子は実行されません。)

于 2012-09-20T20:28:46.873 に答える
1

2 番目の例では、誰かが言及したように、スレッド セーフではありません。getInstance() メソッドをスレッドセーフにするための 2 つのオプションを次に示します。

 public static synchronized Singleton getInstance() {
     if (singleton == null) {
         singleton = new Singleton();
     }
     return singleton;
 }

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

メソッドの 2 番目のバージョンでは、同期のオーバーヘッドなしで、既に構築されたシングルトン インスタンスを取得できます。ただし、null の場合は、同期ブロックに入ります。スレッド コンテキスト スイッチがあり、2 番目のスレッドが実際に同期ブロックに入った場合に備えて、もう一度 null をチェックします。これにより、単一のインスタンスのみが構築されることが保証されます。

いずれのアプローチも、完全にスレッド セーフである必要があります。

于 2012-09-21T04:00:18.977 に答える
0

new Singleton()、クラスがロードされたときにのみ呼び出されます。

于 2012-09-20T20:29:15.483 に答える
0

メンバーsingletonは静的として宣言されているため、new Singleton()一度だけ呼び出されます。

于 2012-09-20T20:29:38.823 に答える
0

この線:

private static Singleton singleton = new Singleton( );

クラスがロードされたときに一度だけ実行されます。これはクラス フィールド初期化子です。

この質問を見てください:ベスト プラクティス: コンストラクターまたは宣言でクラス フィールドを初期化しますか? new Random()――あの質問のと同じ考えですね。

編集: 未回答の質問に回答できるかどうかを確認するために、スタック オーバーフローにちょっと立ち寄ったところ、回答を送信する前に、他の 3 人が既に回答しているようです。スタックオーバーフローが好き!

于 2012-09-20T20:35:19.910 に答える