Java Singleton 模式是一種廣泛使用的設計模式,它保證一個類別只有一個實例並為其提供全域存取點。 將其視為監督團隊的單一經理 - 只有一個經理,每個人都透過該單一聯絡點進行互動。 本文將詳細介紹該模式在 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。枚舉單例(現代方法): 利用枚舉固有的線程安全性和序列化處理。 由於其簡單性和穩健性,這通常被認為是最好的方法。
<code class="language-java">public enum EnumSingleton { INSTANCE; public void showMessage() { System.out.println("Hello from Enum Singleton!"); } }</code>
以上是理解 Java 中的單例模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!