1. シングルトン パターンとは何ですか?
シングルトン: クラスにインスタンスが 1 つだけあることを確認し、それにアクセスするためのグローバル アクセス ポイントを提供します。
シングルトン パターンは、一般的に使用されるソフトウェア設計パターンの 1 つであり、その目的は、アプリケーション全体にクラスのインスタンスが 1 つだけ存在するようにすることです。
たとえば、システムを起動するときに、アプリケーションのライフサイクル全体を通じて表示され、一意であるいくつかの公開構成情報をロードする必要があります。この場合、それをシングルトン モードで設計する必要があります。例: スプリング コンテナ、セッション ファクトリ、キャッシュ、データベース接続プールなど。
2. インスタンスの一意性を確保する方法
1) 外部初期化を防ぐ
2) クラス自身でインスタンス化する 3) インスタンス化は 1 回のみ保証する
4) インスタンスを取得する外部メソッドを提供する
5) スレッドセーフ
3. いくつかの単純な収益モデルの比較
(1) お腹が空いた中華風
「お腹が空いたので、遅滞なくすぐに食べなければなりません」、静的プライベート変数を定義しながらクラスのインスタンス化を実行します。
public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } }
①静的なプライベートクラス変数を宣言してすぐにインスタンス化し、インスタンス化が1回であることを保証します
②外部インスタンス化を防ぐプライベート構築(リフレクションを通じてインスタンス化できますが、この状況は考慮されていません)
③パブリックを提供します getInstance() メソッドは、次の目的で使用されます。シングルトンインスタンスを外部から取得
利点: スレッドの安全性、インスタンスの高速な取得 欠点: クラスのロードはインスタンスの初期化を意味し、メモリの無駄
(2) 怠惰なスタイル
「この人は怠惰なので、それを待ってください」それが必要です」、遅延読み込み。
public class Singleton { private static Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; } }
メリット: インスタンスを取得する方法で、インスタンスを初期化し、システムリソースを節約します
デメリット: ①インスタンス取得時に初期化作業が多いと、読み込み速度が遅くなり、システムパフォーマンスに影響します
②インスタンスを取得するたびに非 null チェックが必要となり、システムのオーバーヘッドが高くなります。 複数のスレッドが同時に getInstance() にアクセスすると、複数のインスタンスが生成される可能性があります。変換:
1) 同期ロック
public synchronized static Singleton getInstance() { if (singleton == null) { singleton = new Singleton(); } return singleton; }
利点: スレッドの安全性、欠点: インスタンスを取得するたびにロックが必要になり、リソースを消費します。実際、インスタンスが生成されている限り、ロックは必要ありません。後続の取得のために再度ロックします
2) ダブルチェックロック
public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }
長所: スレッドセーフ、二重チェック、インスタンスが初期化される前にのみ同期を保証、高効率 短所: インスタンスが空でないかどうかをまだ判断し、消費する特定のリソース
3) 静的内部クラス
public class Singleton { private Singleton() { } private static class SingletonHolder { private static final Singleton singleton = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.singleton; } }
利点: 両方 同期によるパフォーマンスの低下を回避し、読み込みを遅らせることができます
(3) 列挙型
public enum Singleton { INSTANCE; public void init() { System.out.println("资源初始化。。。"); } }
は当然ながらスレッドセーフであり、リフレクションの生成を防ぎますインスタンス。
4. シングルトンパターンの利点と欠点