Java シングルトン パターンは、クラスがインスタンスを 1 つだけ持つことを保証し、そのインスタンスへのグローバル アクセス ポイントを提供する、広く使用されている設計パターンです。 チームを監督する 1 人のマネージャーと考えてください。マネージャーは 1 人だけで、全員がその 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>
以上がJava のシングルトン パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。