看完這篇文章,你對java單例模式會更加了解!!!

簡言:

         客戶端不再需要是否實例化問題,把責任都給了應該負責的類去處理,其實就是一個基本的設計模式:單例模式

單例模式的定義:

保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。通常我們可以讓一個全局變量使得一個對象被訪問,但它不能防止你實例化多個對象,一個最好的辦法就是,讓類保存它的唯一實例,保證這個類沒有其它實例可以被創建,並且提供一個訪問該實例的方法。

單例的結構圖(網上查取)

通過代碼的形式實現一個簡單的單例模式:

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

這是一個簡單的單例模式魔板:

單例除了唯一的實例外還有什麼好處?

單例模式因爲類封裝的唯一實例。這樣它就可以嚴格的控制客戶訪問它,何時訪問它,簡單的說是對唯一實例的受控訪問,。

多線程時的單例

多線程的程序中,多線程的程序中,多個線程同時,調用getInstance()方法,會有可能造成創建多個實例的,

可以給進程一把鎖來處理,這裏需要解釋一下lock語句的含義,lock是確保當一個線程位於代碼的臨界區時,另一個線程不進入臨界區,如果其他線程試圖進入鎖定的代碼。則將一直等待,直到該對象被釋放。

代碼如下:


public class Singleton {
    private static Singleton instance;
    private static Object syncRoot = new Object();
    private Singleton(){}
    public static Singleton getInstance(){
         Lock(syncRoot) {
            if(instance == null){
                instance = new Singleton();
            }
        }

        return instance;
    }
}

靜態初始化

在實際應用當中,靜態初始化方法,這種方法不需要開發人員顯示地編寫線程安全代碼,即可解決線程環境下它是不安全的問題。

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

是什麼是懶漢模式和惡漢模式:

這種靜態初始化的方式時在自己被加載時就將自己實例化,所以被形象的稱之爲餓漢式單例類

要是在第一次被引用時,纔會將自己實例化,所以就被稱之爲懶漢式單例類

 

 

 

 

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