シングルトンモードのコモンモードの詳細説明

シングルトンパターンの定義

シングルトン パターンは、クラスのインスタンスが 1 つだけ存在することを保証し、そのインスタンスを取得するためのグローバル アクセス ポイントを提供するために使用される設計パターンです。

シングルトン パターンでは、クラスのコンストラクターがプライベートになり、他のクラスがそのクラスのインスタンスを直接作成できなくなります。代わりに、静的メソッドまたは静的プロパティを通じてクラスの唯一のインスタンスを取得します。

シングルトンパターンの分類

Java でシングルトン パターンを実装するには多くの方法がありますが、最も一般的な 2 つの方法を次に示します。

飢えた男モード

具体的な実装は次のとおりです。


public class Singleton {
    
    
    //此处,先把实例创建出来
    private static  Singleton instance=new Singleton();

    //如果需要使用这个唯一实例,统一通过 Singleton.getInstance()方法来获取。
    public static Singleton getInstance(){
    
    
        return  instance;
    }

    //为了避免Singleton 类不小心被复制出多份来
    //把构造方法设置为private.在类外面,就无法通过new的方式来创建这个Singleton实例
    private Singleton(){
    
    

    }
}

ここに画像の説明を挿入

ここ静的それは重要な役割を果たします。

  • static は、このインスタンスが一意であることを保証します
  • static は、このインスタンスが特定の時点で実際に作成されることを保証します。
    静的な変更により、現在のインスタンス属性がクラス属性になります。クラス属性はクラス オブジェクト上にあります。クラス オブジェクトは Java プロセス内で一意です (クラス オブジェクトは Java プロセス中にのみ作成されます)。クラスの読み込みフェーズ。インスタンス)

補足知識ポイント:
クラスのロード:
Java コード内の各クラスは、コンパイル後に .class ファイルを取得します。JVM が実行されると、この .class ファイルがロードされ、その中のバイナリ命令が読み取られて、対応するクラス オブジェクトがメモリ内に構築されます。(Singleton.classのような形状)

ここに画像の説明を挿入

  • コンストラクターを次のように設定しますプライベート, クラスの外では、このインスタンスを new で作成することはできません。

飢えた男モードの利点は、実装が簡単であることです。スレッドセーフティインスタンスはクラスのロード時に作成されるためです。ただし、プログラム全体の実行中にインスタンスが使用されないと、リソースの無駄が発生するという欠点があります。

レイジーモード

具体的な実装は次のとおりです。

public class SingletonLazy {
    
    

    private static  SingletonLazy instance=null;

    public static SingletonLazy getInstance(){
    
    
        if(instance==null){
    
    
            instance=new SingletonLazy();
        }
        return instance;
    }

    private SingletonLazy(){
    
    

    }

}

ここに画像の説明を挿入

遅延モードは、クラスのロード時に初期化を行わず、クラスのインスタンスを初めて使用するときに、インスタンスがすでに存在するかどうかを判断して、インスタンスを作成するかどうかを決定します。(遅延インスタンス化。必要な場合にのみ一意のインスタンスを作成します。)

Lazy Man モード利点は、実装が簡単で、必要な場合にのみインスタンスが作成されるため、リソースの無駄が回避されることです。ただしマルチスレッド環境では、スレッドの安全性の問題が発生する、追加の処理が必要です。

上記の遅延パターンをスレッドセーフにする方法は? ロック操作を実行する
ここに画像の説明を挿入

の使用により同期したキーワード。パフォーマンスに影響を与える可能性があります。パフォーマンスを向上させるために、次を使用できますロックをダブルチェックするなどを最適化します。

上記のコードにより、各 getInstance() 操作がロックされます。ロック操作にはオーバーヘッドがあります。ただし、インスタンスの値が null でないと判断された場合、戻り操作が直接トリガーされます。変更操作がないため、このときは不要なロックです。

次のように:
ここに画像の説明を挿入

上記のコードで発生する可能性のあるメモリの可視性の問題や命令の並べ替えの問題を回避するには、次を使用します。揮発性のキーワードの最適化。
コードは以下のように表示されます:

public class SingletonLazy {
    
    
    private volatile static  SingletonLazy instance=null;

    public static SingletonLazy getInstance(){
    
    

        if (instance == null) {
    
    
            synchronized (SingletonLazy.class) {
    
    
                if (instance == null) {
    
    
                    instance = new SingletonLazy();
                }
            }
        }

        return instance;
    }

    private SingletonLazy(){
    
    
    }

}

シングルトンパターンの主な特徴

  • プライベート コンストラクター: コンストラクターをプライベートにすることで、他のクラスがインスタンスを直接作成できないようにします。
  • 静的インスタンス変数: クラス内に静的インスタンス変数を定義して、クラスの唯一のインスタンスを保存します。
  • 静的アクセス メソッド: クラスの唯一のインスタンスを取得するための静的メソッドまたはプロパティを提供します。このメソッドは、最初に呼び出されたときにインスタンスを作成し、後続の呼び出しでは同じインスタンスを返します。

シングルトン パターンの適用シナリオ

  • 構成情報クラス、ログ レコード クラスなど、システム内の特定のクラスのオブジェクトのインスタンスは 1 つだけ存在する必要があります。
  • オブジェクトの頻繁な作成と破棄が必要なシナリオでは、シングルトン モードを使用することでシステム リソースを節約できます。
  • スレッド プール、データベース接続プールなど、オブジェクトをグローバルに共有またはアクセスする必要があるシナリオ。

要約する

シングルトン パターンを実装するときは、スレッド セーフと遅延読み込みの問題に注意する必要があります。ロックやロックの二重チェックなどを使用してスレッドの安全性を確保し、リソースの無駄を避けるために必要な場合にのみインスタンスを作成できます。

おすすめ

転載: blog.csdn.net/m0_63904107/article/details/131731589