單例模式

1.關(guān)于雙檢測(cè)鎖定DCL的問(wèn)題

public class SingletonKerriganD {     

    /**   
     * 單例對(duì)象實(shí)例   
     */    
    private static SingletonKerriganD instance = null;     

    public static SingletonKerriganD getInstance() {     
        if (instance == null) {     
            synchronized (SingletonKerriganD.class) {     
                if (instance == null) {     
                    instance = new SingletonKerriganD();     //A
                }     
            }     
        }     
        return instance;     
    }     
}    

A處的代碼的匯編大致執(zhí)行如下幾步
1.分配內(nèi)存
2.初始化
3.變量指向這個(gè)內(nèi)存
在java上由于支持處理器亂序執(zhí)行,2和3的順序是不定的,假如3先執(zhí)行了,那么第二個(gè)線程在訪問(wèn)的時(shí)候會(huì)因?yàn)樽兞坎粸榭罩苯臃祷?,但這時(shí)還沒(méi)有初始化,所以可以遇見的一定會(huì)報(bào)錯(cuò)。
在c語(yǔ)言中是可行的,在java1.5以后呢引入了volatile ,volatile修飾的變量,保證每次都從堆中讀取,保證在2,3沒(méi)有完全執(zhí)行完的時(shí)候不會(huì)有人可以訪問(wèn)到他。會(huì)影響一定的效率

那么可以采用內(nèi)部靜態(tài)類的方式。

public class SingletonKerrigan implements Serializable {     

    private static class SingletonHolder {     
        /**   
         * 單例對(duì)象實(shí)例   
         */    
        static final SingletonKerrigan INSTANCE = new SingletonKerrigan();     
    }     

    public static SingletonKerrigan getInstance() {     
        return SingletonHolder.INSTANCE;     
    }     

    /**   
     * private的構(gòu)造函數(shù)用于避免外界直接使用new來(lái)實(shí)例化對(duì)象   
     */    
    private SingletonKerrigan() {     
    }     

    /**   
     * readResolve方法應(yīng)對(duì)單例對(duì)象被序列化時(shí)候   
     */    
    private Object readResolve() {     
        return getInstance();     
    }     
} 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1.單例模式概述 (1)引言 單例模式是應(yīng)用最廣的模式之一,也是23種設(shè)計(jì)模式中最基本的一個(gè)。本文旨在總結(jié)通過(guò)Ja...
    曹豐斌閱讀 3,062評(píng)論 6 47
  • 單例模式的實(shí)現(xiàn) 單例模式的實(shí)現(xiàn)一般來(lái)說(shuō)有2種方式:懶漢式(延遲加載)、餓漢式(非延遲加載)。 1. 餓漢式(非延遲...
    JerryL_閱讀 1,029評(píng)論 0 3
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡(jiǎn)單、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮?jiǎn)潔易懂,是項(xiàng)目中最...
    成熱了閱讀 4,530評(píng)論 4 34
  • 前言 本文主要參考 那些年,我們一起寫過(guò)的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個(gè)類僅有一個(gè)...
    tandeneck閱讀 2,623評(píng)論 1 8
  • 一.什么是單例模式 單例模式的定義:確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)他的全局訪問(wèn)點(diǎn)。單例模式是幾個(gè)設(shè)計(jì)模式中...
    Geeks_Liu閱讀 2,327評(píng)論 0 10

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