單例模式是創建型設計模式之一,確保某個類在整個應用程序生命週期中只存在一個實例,並提供一個全局訪問點獲取該實例。當系統需要一個獨一無二的對象來協調行為時,單例是首選方案。
核心要素:private static 實例變量、private 構造函數、public static getInstance() 方法。
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
問題:在多線程環境下,兩個線程可能同時通過 null 檢查,導致創建多個實例,違背單例初衷。
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
優點:實現簡單,線程安全。
缺點:每次調用都需加鎖,性能開銷大,僅首次創建需要同步。
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return uniqueInstance;
}
}
利用 JVM 類加載機制保證線程安全。適用於實例創建開銷小、確會被使用的場景。若實例極佔資源且可能不被用到,則不宜採用。
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
關鍵點:
volatile 禁止指令重排序,確保其他線程看到完全初始化的對象這是高性能場景下的推薦寫法。
掌握單例模式的演進邏輯,能幫助你在實際架構中做出最適合的技術決策。