-1

重複の可能性:
Java でシングルトン パターンを実装する効率的な方法は何ですか?

私はパターンを設計するのが初めてで、学習段階にあります。最近、Singleton パターンについて知り、自分が働いている会社のコードを調べました。次のコード スニペットは、Singleton の規則に従って正しくないように見えます。つまり、メソッドを同期するのではなく、ブロックを同期する必要があります。また、スレッドは、ブロックに入る前に、「インスタンス」変数の値が null かどうかを常にチェックする必要があります。私の理解は正しいですか、それとも次のようにコーディングするロジックがありますか?

public class CustomLogger {

private static CustomLogger instance;

private CustomLogger(){
    some code here....
}

public static synchronized CustomLogger getInstance(){
    if (instance == null){
        instance = new CustomLogger();
    }
    return instance;
}
}
4

3 に答える 3

1

getInstance()メソッドが同期されているため、アプローチは正しいですが、同期が必要なのはgetInstance()の最初の呼び出し、つまりシングルトンオブジェクトを作成するときだけです。他のすべての場合は、すでにインスタンスを作成している必要があります。同期アクセスは必要ありません。

もう1つのアプローチは、シングルトン作成部分のみを同期することです。しかし、そのアプローチ(ダブルロック)には多くの問題があります。これを参照してください:http ://www.ibm.com/developerworks/java/library/j-dcl/index.html

Java 5以降、シングルトンを作成するための最良のアプローチは列挙型を使用することです。

于 2013-01-29T05:58:57.397 に答える
1

シングルトンを使用する必要がある場合は、同期に関するおかしな作業をせずに、ただ熱心に構築してください。あれは:

public class CustomLogger {
  private static CustomLogger instance = new CustomLogger();

  public static CustomLogger instance() { return instance;
}

クラス内のシングルトン インスタンスの遅延初期化による利点はほとんどありません。インスタンスは、問題のクラスがアクティブな使用のためにロードされたときに構築されinstance()ます。

あなたが示したコードの理由は、古い C++ プログラマーが読み込み順序に注意を払っていたためだと思われます。Java では問題にならないものです (読み込み順序は JLS で明確に指定されています)。

于 2013-01-29T06:01:34.773 に答える
0

メソッドを同期するのではなく、ブロックを同期する必要があります。

違う。どちらも問題ありませんが、ブロックをサンクロナイズする方が良い方法です。

ブロックに入る前に、「インスタンス」変数の値が null かどうかを確認します

それがこの行が行っていることです

if (instance == null)
于 2013-01-29T05:58:11.640 に答える