一見如故之java單例模式 singleton

     有人寫文章用深入淺出或者通俗易懂來(lái)形容自己的文章,此時(shí)我這里一見如故再好不過(guò)了 ^_^
一見如故?

大多數(shù)java開發(fā)者,對(duì)于spring真的是不能在熟悉了,每次你的tomcat在啟動(dòng)后是不是會(huì)看見好多個(gè)singleton的字眼,好多開發(fā)者不會(huì)太在意這些東西,可是越深入越得知道這些基礎(chǔ)的東西。在spring所有的bean缺省的生成方式是singleton,也就是說(shuō)你所有的bean在你不指定scope的情況下都會(huì)是singleton(單例模式) 與之對(duì)應(yīng)的原型模式我會(huì)在下次為大家說(shuō)明。


spring-bean4.xsd源文件.png

來(lái)一個(gè)實(shí)際中的場(chǎng)景 這里我將redis連接池使用了單例模式,哈哈默認(rèn)也是單例只不過(guò)為了表述清楚而已


bean.png

這樣的場(chǎng)景,你會(huì)一見如故嗎?
^^
常見的兩種單例模式
    餓漢式與懶漢式

實(shí)現(xiàn)單例,先私有化類的構(gòu)造器,這是就不會(huì)被實(shí)例化了

所謂餓漢式單例模式 看下面代碼

//餓漢式  啟動(dòng)時(shí)就加載了實(shí)例
public class Singlet {

    private Singlet(){

    }
    //直接實(shí)例化了該對(duì)象,別人用時(shí)直接通過(guò)類名調(diào)用getInstance()
    //這樣就實(shí)現(xiàn)了餓漢式,管你需不需要直接通過(guò)getInstance()得到
    private final static  Singlet singlet = new Singlet();
    
    //獲取該類
    public static Singlet  getInstance(){

        return singlet;
    }


}

提到懶漢式單例模式 不能不一見如故了 又得引用spring bean了 嘿嘿


image.png

接著看下spring-bean.xsd lazy-init的說(shuō)明 默認(rèn)不開啟懶漢模式的 在spring中如果你開啟了懶漢模式 以為著只有你使用這個(gè)bean時(shí)才會(huì)被初始化


image.png

直接看代碼 探探究竟

//懶漢式  當(dāng)有訪問(wèn)時(shí)才加載實(shí)例
public class Singlet2 {

    private Singlet2(){

    }
    //這里類變量初始空引用 
    private static Singlet2 singlet2 = null;
    //調(diào)用此方式時(shí)有個(gè)邏輯判斷 有實(shí)例則直接返回類變量 沒(méi)有則實(shí)例化該類 真正實(shí)現(xiàn)了懶加載
    public static Singlet2 getSinglet2(){

        //進(jìn)行的這步內(nèi)容會(huì)發(fā)生線程安全問(wèn)題 并發(fā)情境下  故不考慮
       /* if(singlet2==null){
            singlet2 = new Singlet2();
        }*/
       if(singlet2 == null){
           synchronized (Singlet2.class){
               singlet2 = new Singlet2();
           }
       }

        return  singlet2;
    }

}

一見如故,我是FirmJack

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

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