單例模式確保整個應用程序中只有一個實例,即對象只能被 new 一次。
public class Singleton {
private static Singleton singleton;
public static Singleton getSingleton() {
if (singleton == null) singleton = new Singleton();
return singleton;
}
}
高併發下可能創建多實例。
public synchronized static Singleton getSingleton() {
if (singleton == null) singleton = new Singleton();
return singleton;
}
線程安全但性能低,實例化後每次調用仍需同步。
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) singleton = new Singleton();
}
}
return singleton;
}
減少同步開銷,但指令重排可能導致返回未初始化對象。
private volatile static Singleton singleton;
volatile 禁止指令重排,保證初始化可見性,實現高性能線程安全。
public class Singleton {
private static Singleton singleton = new Singleton();
public static Singleton getSingleton() { return singleton; }
}
類加載時即創建,天然線程安全,但無延遲加載能力。
public class Singleton {
static class SingletonManager {
private final static Singleton SINGLETON = new Singleton();
public final static Singleton getSingleton() { return SINGLETON; }
}
public static Singleton getInstance() { return SingletonManager.getSingleton(); }
}
結合延遲加載(首次調用才初始化內部類)與線程安全(類加載機制保證),無鎖高性能。
共享資源管理:數據庫連接池、線程池、配置管理器、日志對象等。
| 維度 | 單例 | 靜態類 |
|---|---|---|
| 繼承/多態 | 支持 | 不可繼承,無多態 |
| 延遲加載 | 支持 | 編譯期初始化,不支持 |
| 單元測試 | 易於 Mock | 難以 Mock,靜態方法不可覆寫 |
| 性能 | 略低(首次調用開銷) | 極高(無實例化開銷) |
純工具方法可用靜態類;需狀態、繼承、測試選單例。