如何高效的實現(xiàn)單例模式

在面向?qū)ο笳Z言開發(fā)中,單例模式作為23種設計模式中最簡單的設計模式,對于我們來說并不陌生,但如何準確并高效的實現(xiàn)單例模式,對于我們來說還是得好好考慮一下。

第一種單例模式:

public class SingletonInstance {

private static SingletonInstance instance;

private SingletonInstance() {
}

public static SingletonInstance getInstance() {
    if (instance == null) {
        instance = new SingletonInstance();
    }
    return instance;
}
}

相信大家對這段代碼都不陌生,因為我們大多都寫過這樣的代碼。但這種寫法會帶來很明顯的缺陷,當我們在多線程中執(zhí)行這段代碼的時候,如果至少兩個線程都執(zhí)行了getInstance()方法,并且都對instance判斷結(jié)果為null,這個時候就會產(chǎn)生至少兩個SingletonInstance實例。所以從嚴格意義上講,這種寫法是不正確的。

接下來我們看第二種寫法:

public class SingletonInstance {

private static SingletonInstance instance;

private SingletonInstance() {
}

public synchronized static SingletonInstance getInstance() {
    if (instance == null) {
        instance = new SingletonInstance();
    }
    return instance;
}
}

這種方法也是我們比較容易想到的,這種寫法滿足了正確性原則,但頻繁的加鎖操作也會讓我們的代碼顯得不夠高效,如何保證既正確又高效的寫法呢?

我們繼續(xù)來看第三種實現(xiàn):

public class SingletonInstance {

private static SingletonInstance instance;
private static Object syncObj = new Object();


private SingletonInstance() {
}

public static SingletonInstance getInstance() {
    if (instance == null) {
        synchronized (syncObj) {
            if (instance == null) {
                instance = new SingletonInstance();
            }
        }
    }
    return instance;
}
}

這種寫法是對第二種實現(xiàn)方式的一種改進,即只有在第一次獲取SingletonInstance實例時才會進行加鎖操作,基本上達到了高效的寫法。

接下來我們來看第四種實現(xiàn)方式:

public class SingletonInstance {

private static SingletonInstance instance = new SingletonInstance();

private SingletonInstance() {
}

public static SingletonInstance getInstance() {
    return instance;
}
}

比起前面幾種實現(xiàn)方式,這種寫法算是最高效的了,在jvm類加載器加載SingletonInstance時即已經(jīng)生成SingletonInstance實例。所以在我們調(diào)用getInstance()時也不存在instance為null的情況。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容