單例模式

01 定義

單例模式:確保一個類只有一個實例,并提供一個全局訪問點。

02 線程安全下的三種實現(xiàn)方式

  • 01 餓漢式
public class Singleton {
    // 類加載時,就進行對象實例化。
    // 缺點:類加載時就初始化,浪費內(nèi)存。
    private static final Singleton singleton = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return singleton;
    }
}
  • 02 懶漢式 (不推薦)
public class Singleton {

    private static Singleton singleton;

    private Singleton(){}

    // 添加synchronized關鍵字,確保不會有兩個線程同時進入該方法。
    // 缺點:只有第一次執(zhí)行此方法時,才真正需要同步。之后每次調(diào)用此方法,同步都是一種累贅,嚴重降低性能。
    public static synchronized Singleton getInstance(){
        if(singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}
  • 03 雙重檢查加鎖
public class Singleton {
    // volatile關鍵字確保singleton變量被初始化成Singleton實例時,多個線程能正確的處理singleton變量。
    private volatile static Singleton singleton;

    private Singleton(){}

    public static Singleton getInstance(){
        // 雙重檢查加鎖,這樣只有第一次才會同步。
        if(singleton == null){
            synchronized (Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();
                }
            }
        }

        return singleton;
    }
}
  • 04 使用靜態(tài)內(nèi)部類
public class Singleton {

    private Singleton(){}

    public static final Singleton getInstance(){
        return SingletonHolder.singleton;
    }

    // 靜態(tài)內(nèi)部類
    private static class SingletonHolder{
        private static final Singleton singleton = new Singleton();
    }
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容