SIngleton 單例模式

單例模式(Singleton)
也叫單子模式,是一種常用的軟件設(shè)計模式。在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在。許多時候整個系統(tǒng)只需要擁有一個的全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為。比如在某個服務(wù)器程序中,該服務(wù)器的配置信息存放在一個文件中,這些配置數(shù)據(jù)由一個單例對象統(tǒng)一讀取,然后服務(wù)進(jìn)程中的其他對象再通過這個單例對象獲取這些配置信息。這種方式簡化了在復(fù)雜環(huán)境下的配置管理。

一般通過 {className}.getInstance()來獲得.

1: 餓漢式

特點: 線程安全,調(diào)用效率高,但是不能延時加載

public class Singleton {
    private Singleton() {
    }

    private static Singleton singleton = new Singleton();

    public static Singleton getInstance(){
        return singleton;
    }
    
    //...other function
}

2: 懶漢式

特點: 線程安全, 調(diào)用效率不高, 可以延長加載.

public class Singleton {
    private static Singleton singleton = null;

    private Singleton() {
    }
    
    //注意, 這里一定要用synchronized保證線程安全
    synchronized public static Singleton getInstance(){
        if( null == singleton )
            singleton = new Singleton();

        return singleton;
    }

    //...other function
}

3: 懶漢式--雙重檢查

特點: 線程安全, 調(diào)用效率高, 可以延長加載.

方法2中的性能不夠好. 可以做如下的改進(jìn), volatile關(guān)鍵字的重要作用是禁止指令重排序, 保證內(nèi)存不會出現(xiàn)內(nèi)存分配, 返回對象引用, 初始化這樣的錯序.
下面的代碼即為餓漢式的雙重檢查.

public class Singleton {
    private Singleton(){}

    private volatile static Singleton singleton = null;

    public static Singleton getInstance(){
        if( null == singleton ){
            synchronized (Singleton.class){
                if( null == singleton ){
                    singleton = new Singleton();
                }
            }
        }

        return singleton;
    }
}

4: 枚舉

特點: 線程安全, 調(diào)用效率高, 不能延長加載, 代碼精簡

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

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