11

私には2つの選択肢があります:

  1. シングルトンパターン

    class Singleton{
        private static Singleton singleton = null;
    
        public static synchronized Singleton getInstance(){
            if(singleton  == null){
                singleton = new Singleton();
            }
            return singleton;
        }
    }
    
  2. static finalフィールドを使用する

    private static final Singleton singleton = new Singleton();
    
    public static Singleton getSingleton() {
        return singleton;
    }
    

違いは何ですか?(シングルスレッドまたはマルチスレッド)

更新:私はビルピューまたはenum方法を知っています。私は正しい方法を探していませんが、1つしか使用していません。b/ w 1または2に本当に違いはありますか?

4

4 に答える 4

10

主な違いは、最初のオプションでは、シングルトンはgetInstanceが呼び出されたときにのみ初期化されるのに対し、2 番目のオプションでは、包含クラスがロードされるとすぐに初期化されることです。

怠惰でスレッドセーフな 3 番目の (推奨) オプションは、列挙型を使用することです。

public enum Singleton {
    INSTANCE;
}
于 2012-12-05T13:23:01.697 に答える
3

1 つの違いがあります。

ソリューション 1 は遅延初期化です。シングルトン インスタンスは、最初の呼び出しで作成されます。getInstance

ソリューション 2 は熱心な初期化です。クラスがロードされると、シングルトン インスタンスが作成されます。

どちらもスレッド セーフです。2 番目のものをマルチ スレッドと呼ぶのは少し誤解を招きます

于 2012-12-05T13:26:22.613 に答える
2

最初の解決策は怠惰に見えますが、実際にはそうではありません。

静的メソッド/フィールドに初めてアクセスすると、クラスが初期化されます。

それgetInstance()は、クラスの唯一の公的にアクセス可能な静的メソッド/フィールドである可能性があります。それがシングルトンのポイントです。

その後、誰かがgetInstance()初めて呼び出したときにクラスが初期化されます。つまり、2つのソリューションは基本的に怠惰で同じです。

もちろん、2番目のソリューションは見た目もパフォーマンスも優れています。

于 2012-12-05T16:15:02.967 に答える
1

したがって、更新により、上記の両方のオプションがスレッドセーフになります。ただし、このsynchronizedオプションでは、呼び出す各スレッドがinstanceこのロックを取得する必要があるため、これが頻繁に行われるとパフォーマンスが低下します。また、synchronizedメソッド レベルで使用すると、公開されているロック (クラス自体) を使用するという潜在的な問題があるため、一部のスレッドがこのロックを取得すると (可能性がある)、デッドロックが発生する可能性があります。このstatic finalオプションはパフォーマンスが向上しますが、シングルトンの遅延初期化は行いません (システムによっては問題にならない場合があります)。

シングルトンのスレッドセーフな遅延初期化を可能にする別のオプションは次のとおりです。

 public class MySingleton{
      private static class Builder{
          private static final MySingleton instance = new MySingleton();
      }

      public static MySingleton instance(){
           return Builder.intance;
      }
 }

これが機能するのは、静的内部クラスが、それを含むクラスのメソッドが実行される前に初期化されることが保証されているためです。

于 2012-12-05T13:26:52.460 に答える