設(shè)計(jì)模式——單例模式

單例模式


在當(dāng)前進(jìn)程中,通過單例模式創(chuàng)建的類有且只有一個實(shí)例。
特點(diǎn):
1. 保證在一個JVM中,該對象只有一個實(shí)例存在
2. 構(gòu)造器必須是私有的,外部類無法通過調(diào)用構(gòu)造器方法創(chuàng)建該實(shí)例
3. 沒有公開的set方法,外部類無法調(diào)用set方法創(chuàng)建該實(shí)例
4. 提供一個公開的get方法獲取唯一的這個實(shí)例
優(yōu)點(diǎn):
1. 減少系統(tǒng)開銷,減低內(nèi)存使用頻率
2. 避免對資源的重復(fù)占用

餓漢模式

把對象提前實(shí)例化,外部第一次獲取這個類的對象時就直接存在這個類,省去創(chuàng)建的開銷
//餓漢模式
class HungrySingleton{
    //1.私有構(gòu)造函數(shù),保證不能實(shí)例化本類
    private HungrySingleton(){}
    //2. 創(chuàng)建一個類的實(shí)例化對象
    private static HungrySingleton hungrySingleton = new HungrySingleton();
    //3. 創(chuàng)建一個get方法,返回一個實(shí)例
    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }
}

懶漢模式

對象沒有被提前實(shí)例化,外部第一次獲取這個類的對象時是空的,需要初始化,賦值

線程不安全的模式

多個線程調(diào)用getInstance方法來獲取Singleton的實(shí)例是,可能會導(dǎo)致實(shí)例化了兩個對象
// 懶漢模式
class LazySingleton{
    //1.私有構(gòu)造函數(shù),保證不能實(shí)例化本類
    private LazySingleton(){}
    //2. 自己創(chuàng)建一個類的實(shí)例化 
    private  static LazySingleton singleton;
    //3. 創(chuàng)建一個get方法,返回實(shí)例
    public static LazySingleton getInstance(){
        //判斷singleton是否為null,如果為null,即判定需要實(shí)例化
        if (singleton == null) {
            singleton= new LazySingleton();
        }
        return singleton;
    }
}

線程安全模式

// 懶漢模式
class LazySingleton{
    //1.私有構(gòu)造函數(shù),保證不能實(shí)例化本類
    private LazySingleton(){}
    //2. 自己創(chuàng)建一個類的實(shí)例化 (volatile保證不會發(fā)生重排序)
    private volatile static LazySingleton singleton;
    //3. 創(chuàng)建一個get方法,返回實(shí)例
    public static LazySingleton getInstance(){
        //判斷singleton是否為null,如果為null,即判定需要實(shí)例化
        if (singleton == null) {
            //同步塊,線程安全的創(chuàng)建實(shí)例
            synchronized (LazySingleton.class){
               // 再次檢測實(shí)例是否存在
               if (singleton == null){
                   singleton= new LazySingleton();
                    // 字節(jié)碼層
                    //JIT 即時編譯 CPU
                    //1. 分配空間
                    //2. 初始化
                    //3. 引用賦值
                }
            }
        }
        return singleton;
    }
volatile的作用:
1. 防止指令重排序,對象的實(shí)例化包含創(chuàng)建和賦值
2. 保證內(nèi)存可見,volatile修飾的變量,不會被本地緩存,所有線程對該對象的讀寫都會第一時間同步到主內(nèi)存。

懶漢模式和餓漢模式的區(qū)別

兩者的根本區(qū)別在于對象是否別提前實(shí)例化,以及線程的安全問題
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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