(九)單例模式的幾種實現方式

參考鏈接:https://www.runoob.com/design-pattern/singleton-pattern.html

一、懶漢式(線程不安全)

懶漢的意思就是我不生成實例,到使用時才生成第一個實例。

實現簡單,但因爲取唯一實例時未加鎖,因此不支持多線程。

public clsaa Singleton{
    private static Singleton instance;
    private Singleton();
    
    public static Singleton getInstance(){
        if(instance == null)
            instance = new  Singleton();
        return instance;
    }
}

二、懶漢式(線程安全)

對getInstance函數進行加鎖。但此方法效率低下,因爲常見情況下都不需要同步。

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

三、餓漢式

在調用獲取實例函數前就將實例初始化了,不會出現懶漢式中生成多個實例的情況,因此是線程安全的。

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

四、雙重檢測鎖

多線程下安全且能保持高性能

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}

爲什麼進行了雙重檢測?

參考鏈接:https://www.cnblogs.com/xz816111/p/8470048.html

五、

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章