ホームページ > 类库下载 > java类库 > Javaシングルトンパターンを実装する方法

Javaシングルトンパターンを実装する方法

高洛峰
リリース: 2016-11-04 17:29:02
オリジナル
1775 人が閲覧しました

1. シングルトン パターンとは何ですか?

シングルトン: クラスにインスタンスが 1 つだけあることを確認し、それにアクセスするためのグローバル アクセス ポイントを提供します。

シングルトン パターンは、一般的に使用されるソフトウェア設計パターンの 1 つであり、その目的は、アプリケーション全体にクラスのインスタンスが 1 つだけ存在するようにすることです。

たとえば、システムを起動するときに、アプリケーションのライフサイクル全体を通じて表示され、一意であるいくつかの公開構成情報をロードする必要があります。この場合、それをシングルトン モードで設計する必要があります。例: スプリング コンテナ、セッション ファクトリ、キャッシュ、データベース接続プールなど。

Javaシングルトンパターンを実装する方法

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. シングルトンパターンの利点と欠点

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート