ホームページ > Java > &#&チュートリアル > Java のシングルトン パターンを理解する

Java のシングルトン パターンを理解する

Linda Hamilton
リリース: 2025-01-24 02:25:08
オリジナル
467 人が閲覧しました

Understanding the Singleton Pattern in Java

Java シングルトン パターンは、クラスがインスタンスを 1 つだけ持つことを保証し、そのインスタンスへのグローバル アクセス ポイントを提供する、広く使用されている設計パターンです。 チームを監督する 1 人のマネージャーと考えてください。マネージャーは 1 人だけで、全員がその 1 つの連絡先を通じてやり取りします。 この記事では、Java でのパターンの実装とさまざまなアプローチについて詳しく説明します。

シングルトン パターンを使用する理由

  • 保証された単一インスタンス: アプリケーション内にクラスのインスタンスが 1 つだけ存在することを保証します。これは、データベース接続 (過剰な接続の作成と破壊を避ける) やプリンター スプーラー (ユーザー間の競合を防ぐ) などのリソースを管理するために非常に重要です。
  • グローバル アクセス ポイント: インスタンスにすぐに使用できる単一のアクセス ポイントを提供します。
  • リソース管理: 構成、ロギング システム、スレッド プールなどの共有リソースを効率的に管理します。

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

いくつかのアプローチが存在し、それぞれに独自のトレードオフがあります。

1.遅延初期化: 最初に必要になった場合にのみインスタンスを作成します。

<code class="language-java">import java.io.Serializable;

public class LazySingleton implements Serializable {
    private static LazySingleton instance;

    private LazySingleton() {
        if (instance != null) {
            throw new IllegalStateException("Instance already created");
        }
    }

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

    private Object readResolve() {
        return getInstance();
    }
}</code>
ログイン後にコピー

2.スレッドセーフ シングルトン: synchronized を使用して、インスタンスの作成中にスレッドの安全性を確保します。

<code class="language-java">import java.io.*;

public class ThreadSafeSingleton implements Serializable {
    private static final long serialVersionUID = 1L;
    private static ThreadSafeSingleton instance;

    private ThreadSafeSingleton() {
        if (instance != null) {
            throw new IllegalStateException("Instance already created");
        }
    }

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

    private Object readResolve() {
        return getInstance();
    }
}</code>
ログイン後にコピー

3.二重チェックされたロック: 同期オーバーヘッドを最小限に抑えてスレッドの安全性を最適化します。

<code class="language-java">import java.io.*;

public class DoubleCheckedLockingSingleton implements Serializable {
    private static final long serialVersionUID = 1L;
    private static volatile DoubleCheckedLockingSingleton instance;

    private DoubleCheckedLockingSingleton() {
        if (instance != null) {
            throw new IllegalStateException("Instance already created");
        }
    }

    public static DoubleCheckedLockingSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedLockingSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedLockingSingleton();
                }
            }
        }
        return instance;
    }

    private Object readResolve() {
        return getInstance();
    }
}</code>
ログイン後にコピー

4. Bill Pugh Singleton (推奨): 静的内部クラスを使用して、遅延初期化とスレッドの安全性を確保します。

<code class="language-java">import java.io.*;

public class BillPughSingleton implements Serializable {
    private static final long serialVersionUID = 1L;

    private BillPughSingleton() {
        if (SingletonHelper.INSTANCE != null) {
            throw new IllegalStateException("Instance already created");
        }
    }

    private static class SingletonHelper {
        private static final BillPughSingleton INSTANCE = new BillPughSingleton();
    }

    public static BillPughSingleton getInstance() {
        return SingletonHelper.INSTANCE;
    }

    private Object readResolve() {
        return getInstance();
    }
}</code>
ログイン後にコピー

5. Enum Singleton (最新のアプローチ): 固有のスレッド セーフと列挙型のシリアル化処理を利用します。 これは、そのシンプルさと堅牢さの点で最良のアプローチであると考えられています。

<code class="language-java">public enum EnumSingleton {
    INSTANCE;

    public void showMessage() {
        System.out.println("Hello from Enum Singleton!");
    }
}</code>
ログイン後にコピー

シングルトン実装の概要

  • 遅延初期化: シンプルですが、スレッド セーフとシリアル化のために追加の処理が必要です。
  • スレッドセーフ シングルトン: スレッドセーフですが、同期によりパフォーマンスのオーバーヘッドが発生する可能性があります。
  • ダブルチェック ロック: 基本的なスレッドセーフなアプローチよりもパフォーマンスが向上します。
  • Bill Pugh Singleton: エレガントで効率的で、そのシンプルさとスレッドの安全性により好まれることがよくあります。
  • Enum Singleton: Java の組み込み機能を活用した、最も簡潔で堅牢なソリューション。 一般に、最新の Java 開発に推奨されます。

以上がJava のシングルトン パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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