小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

快速理解Java中的五種單例模式

 森顏銘 2019-01-11

解法一:只適合單線程環(huán)境(不好)

復(fù)制代碼
package test;
/**
 * @author xiaoping
 *
 */
public class Singleton {
    private static Singleton instance=null;
    private Singleton(){
        
    }
    public static Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}
復(fù)制代碼

注解:Singleton的靜態(tài)屬性instance中,只有instance為null的時(shí)候才創(chuàng)建一個(gè)實(shí)例,構(gòu)造函數(shù)私有,確保每次都只創(chuàng)建一個(gè),避免重復(fù)創(chuàng)建。
缺點(diǎn):只在單線程的情況下正常運(yùn)行,在多線程的情況下,就會(huì)出問題。例如:當(dāng)兩個(gè)線程同時(shí)運(yùn)行到判斷instance是否為空的if語句,并且instance確實(shí)沒有創(chuàng)建好時(shí),那么兩個(gè)線程都會(huì)創(chuàng)建一個(gè)實(shí)例。

解法二:多線程的情況可以用。(懶漢式,不好)

復(fù)制代碼
public class Singleton {
    private static Singleton instance=null;
    private Singleton(){
        
    }
    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}
復(fù)制代碼

注解:在解法一的基礎(chǔ)上加上了同步鎖,使得在多線程的情況下可以用。例如:當(dāng)兩個(gè)線程同時(shí)想創(chuàng)建實(shí)例,由于在一個(gè)時(shí)刻只有一個(gè)線程能得到同步鎖,當(dāng)?shù)谝粋€(gè)線程加上鎖以后,第二個(gè)線程只能等待。第一個(gè)線程發(fā)現(xiàn)實(shí)例沒有創(chuàng)建,創(chuàng)建之。第一個(gè)線程釋放同步鎖,第二個(gè)線程才可以加上同步鎖,執(zhí)行下面的代碼。由于第一個(gè)線程已經(jīng)創(chuàng)建了實(shí)例,所以第二個(gè)線程不需要?jiǎng)?chuàng)建實(shí)例。保證在多線程的環(huán)境下也只有一個(gè)實(shí)例。
缺點(diǎn):每次通過getInstance方法得到singleton實(shí)例的時(shí)候都有一個(gè)試圖去獲取同步鎖的過程。而眾所周知,加鎖是很耗時(shí)的。能避免則避免。

解法三:加同步鎖時(shí),前后兩次判斷實(shí)例是否存在(可行)

復(fù)制代碼
public class Singleton {
    private static Singleton instance=null;
    private Singleton(){
        
    }
    public static Singleton getInstance(){
        if(instance==null){
            synchronized(Singleton.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}
復(fù)制代碼

注解:只有當(dāng)instance為null時(shí),需要獲取同步鎖,創(chuàng)建一次實(shí)例。當(dāng)實(shí)例被創(chuàng)建,則無需試圖加鎖。
缺點(diǎn):用雙重if判斷,復(fù)雜,容易出錯(cuò)。

解法四:餓漢式(建議使用)

復(fù)制代碼
public class Singleton {
    private static Singleton instance=new Singleton();
    private Singleton(){
        
    }
    public static Singleton getInstance(){
        return instance;
    }
}
復(fù)制代碼

注解:初試化靜態(tài)的instance創(chuàng)建一次。如果我們在Singleton類里面寫一個(gè)靜態(tài)的方法不需要?jiǎng)?chuàng)建實(shí)例,它仍然會(huì)早早的創(chuàng)建一次實(shí)例。而降低內(nèi)存的使用率。

缺點(diǎn):沒有l(wèi)azy loading的效果,從而降低內(nèi)存的使用率。

解法五:靜態(tài)內(nèi)部內(nèi)。(建議使用)

復(fù)制代碼
public class Singleton {
    private Singleton(){
        
    }
    private static class SingletonHolder{
        private final static Singleton instance=new Singleton();
    }
    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}
復(fù)制代碼

注解:定義一個(gè)私有的內(nèi)部類,在第一次用這個(gè)嵌套類時(shí),會(huì)創(chuàng)建一個(gè)實(shí)例。而類型為SingletonHolder的類,只有在Singleton.getInstance()中調(diào)用,由于私有的屬性,他人無法使用SingleHolder,不調(diào)用Singleton.getInstance()就不會(huì)創(chuàng)建實(shí)例。
優(yōu)點(diǎn):達(dá)到了lazy loading的效果,即按需創(chuàng)建實(shí)例。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多