単例モードはこんなに簡単です!


単純な例です
コアの役割:
1つのインスタンスのみが保証され、そのインスタンスにアクセスするグローバル・アクセス・ポイントが1つ提供されます.
一般的な適用シーン:
Windowsのタスクマネージャとリサイクルステーション
プロジェクトのプロファイル
ウェブサイトのカウンタは、一般的に単一のモードを採用しています.そうしないと同期しにくいです.
アプリケーション・ログ、共有ログ・ファイルは常に単一のオープン状態であり、追加が容易なのはインスタンスが1つだけです.
データベース接続プール
オペレーティングシステムファイルシステム、1つのオペレーティングシステムに1つのファイルシステムしかありません
アプリケーション(servletプログラミング中)
スプリングのBeanも一例です
サーブレットもコントローラも一例です
シングル・インスタンス・モードのポイント:
インスタンスが1つしかないため、システムのパフォーマンスオーバーヘッドが削減され、1つのオブジェクトの生成に多くのリソースが必要な場合、たとえば構成の読み取り、他のオブジェクト依存性の発生など
アプリケーションの起動時に単一のオブジェクトを生成し、メモリを永続的に保存することで解決できます.
一般的な5つの中の1つのパターン:
餓漢式(スレッドは安全で呼び出し効率は高いが、遅延負荷はできない)
怠け者式(スレッドは安全で、呼び出し効率が高く、遅延ロードできない)
その他:
二重検出ロック(JVM低層メモリモデルのため、たまに問題が発生し、使用を推奨しない)
静的内部クラス(スレッドが安全で、呼び出し効率が高く、遅延ロード可能)
列挙例(スレッドが安全で、呼び出し効率が高く、遅延ロードできない)
餓漢式:
public class Singleton{
    private static final Singleton = new Singleton();

   private Singleton(){}
   public static Singleton getInstance(){
     return s;
}

}

怠け者:
public class Singleton{
    private static Singleton s;
    
    private Singleton(){}
    
    public static synchronized Singleton getInstance(){
        if(s==null){
            s = new Singleton();
        }
        return s;
    }
}

二重ロック検出:
public class Singleton{
    private static Singleton instance = null;
    
    private Singleton(){}
    
    public static  Singleton getInstance(){
        if(instance == null){
            Singleton sc;
            synchronized(Singleton.class){
                sc = instance;
                if(sc==null){
                    synchronized(Singleton.class){
                        if(sc==null){
                            sc=new Singleton();
                        }
                    }
                instance=sc;
                }
            }
        }
        return instance;
    }
}

静的内部クラス:
public class Singleton{
    private static class Singleton{
        private static final Singleton instance = new Singleton();
    }
    private Singleton(){}
    
    public static Singleton getInstance(){
        return Singleton.instance;
    }
    
    
}

列挙実装:
public enum Yeshuai{
    himself;
    private String anotherField;
    Yeshuai(){
        himself = new Yeshuai();//          ,               
    }
    public void sayHello(){
        System.out.println("hello yeshuai");
    }
}

call:Yeshuai.himself.sayHello();

選択方法:
単一のオブジェクトの占有リソースが少なく、遅延負荷を必要としない列挙は餓漢式より優れている.
単一のオブジェクトがリソースを占有する場合、静的内部クラスを遅延ロードする必要があります.怠け者よりも優れています.
マルチスレッド環境でのテスト時間効率の比較
餓漢式:22 ms
怠け者式:636 ms
静的内部クラス:28 ms
列挙式:32 ms
ダブルチェックロック:65 ms