9

私はJavaに非常に慣れておらず、Javaでほとんどコーディングしていないため、次のコードが何をするのか本当にわかりません。

質問は、次のコードで最悪のことを説明するオプションを選択してください。

public class Bolton {
    private static Bolton INST = null;

    public static Bolton getInstance()
    {
        if ( INST == null )
        {
            INST = new Bolton();
        }
        return INST;
    }

    private Bolton() {
    }
}

この質問の選択肢は次のとおりです

  1. Bolton の複数のインスタンスを作成できます
  2. ボルトンは決して作成されません
  3. コンストラクターはプライベートであり、呼び出すことはできません
  4. 値はガベージ コレクションされる可能性があり、getInstance の呼び出しはガベージ データを返す場合があります

上記の選択肢のうち、正しいものはどれですか? なぜ?

4

8 に答える 8

8

これはシングルトンパターンです

シングルトン パターンの考え方は、クラスの使用可能なインスタンスを 1 つだけ持つことです。したがって、constructorが に設定され、クラスは、この場合、このクラス内の既存のインスタンス変数を呼び出すメソッド、または実行中のプログラム用に新しいインスタンス変数を作成するメソッドをprivate維持します。スレッドセーフではないため、答えはおそらく 1 です。以前に書いた 3 と混同されるかもしれませんが、これは技術的に設計されたものであり、実際には欠陥ではありません。getInstance()INST

ウィキペディアのLazy Initialization、スレッドセーフなシングルトン パターンの例を次に示します。

public class SingletonDemo {

    private static volatile SingletonDemo instance = null;

    private SingletonDemo() {  } 

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

}

インスタンス変数を に設定すると、 volatileJava はそれをメモリから読み取り、キャッシュには設定しません。

同期されたステートメントまたはメソッドは、同時実行に役立ちます。

「遅延初期化」シングルトンで発生する二重チェックロックについて詳しく読む

于 2013-03-15T05:25:02.817 に答える
2

Boltonの複数のインスタンスを作成できます

上記のコードでは同期が取れていないため、このオプションは正しいです。

2つのスレッドが同時にチェックしnull、両方が値がであることを検出し、両方がコンストラクター(シングルトンに反論する)nullを呼び出すとします。

nullまた、2つのスレッドが一緒にチェックしないが、1つのスレッドがコンストラクターを呼び出すと仮定した場合でも、これには他の問題があります。ただし、コンストラクターはオブジェクトが構築されるまで戻りません(オブジェクトの作成にコストがかかり、時間がかかると想定)。したがって、コンストラクターが戻るまで、他のスレッドが条件をチェックし、オブジェクトがまだ構築さnullれていないため、オブジェクトを見つける可能性があります。 null

いくつかの前提条件がレースの原因であるcheck-then-actと呼ばれるこのシナリオ。

シングルトンの場合、使用されている2つの標準があります。

更新:ダブルチェックロック について説明している別のすばらしい記事があります

于 2013-03-15T05:34:18.403 に答える
2

インタビュアーは基本的にシングルトンパターンの知識をチェックしたい. パターンが壊れることはありますか? 答えはいです。シングルトンがシングルトンでない場合は、これまたはグーグルを確認してください。

Joshua Blochが提案するように、最善のコースはEnumベースのシングルトンを使用することです

于 2013-03-15T05:24:43.520 に答える
1

getInstance()メソッドは同期する必要があります。そうしないと、複数のスレッドが同時に呼び出すと、多くのインスタンスが作成される可能性がありますgetInstance()。したがって、私はオプション 1 を選択します。

于 2013-03-15T05:28:27.347 に答える
1

このクラスのオブジェクトを 1 つだけ持ちたい場合はシングルトン パターンを使用し、あらゆる場所で使用します。したがって、クラスが多くのオブジェクトを作成するように制限するには private、このクラスのコンストラクターに使用する必要があります。そしてpublic、このクラスのオブジェクトを返す関数を 1 つ作成します。

public class MethodWin {
    private int isLoggedOn=0;
    private static MethodWin objectMethodWin = new MethodWin();
    private MethodWin() { }
    public static MethodWin getInstance() {
        return objectMethodWin;
    }
    public void setIsLoggedOn(int value) {
       this.isLoggedOn=value;
    }
    public int getIsLoggedOn() {
       return this.isLoggedOn;
    }
}

したがって、このオブジェクトを作成する必要がある場合は、次のようにする必要があります。

MethodWin meth = MethodWin.getInstance();
于 2013-03-15T06:09:10.443 に答える
0

リフレクションにより、コンストラクターがプライベートであっても、多くのオブジェクトを作成できます。
マルチスレッド環境では、複数のインスタンスを作成する可能性があります。
シリアル化により、複数のオブジェクトを作成する可能性があります。

于 2013-03-15T05:52:04.330 に答える
0

元の回答は、ボルトンのインスタンスが 1 つだけ作成されるというものです。

于 2013-03-15T05:48:21.913 に答える
0

簡単な答えは2) A Bolton will never be created、インスタンスを作成すると、getInstance メソッドを呼び出すときにコンストラクターがコンストラクターの初期化内で呼び出され、単一のインスタンスが作成されるためです。

于 2013-03-15T05:57:56.947 に答える