基本概念
單例模式指的是:對於某一個類,整個程序中值存在一個該類的實例對象。常見的比如數據庫連接對象等。代碼示例,單例模式的幾種寫法及優劣
/**
* 餓漢式寫法,多線程下不能保證對象的確定性
**/
public class SingletonHungryUnsec {
private static SingletonHungryUnsec instance;
private SingletonHungryUnsec() {
}
/**
* 餓漢式,且線程不安全
* @return instancce
*/
public static SingletonHungryUnsec getInstance (){
if (null == instance) {
instance = new SingletonHungryUnsec();
}
return instance;
}
}
實際操作時,不推薦這樣的寫法。
public class SingletonHungrySec {
private static SingletonHungrySec instance;
private SingletonHungrySec() {
}
/***
* 餓漢式,線程安全型
* @return instance
*/
public static SingletonHungrySec getInstance () {
if (null == instance) {
synchronized (SingletonHungrySec.class) {
if (null == instance) {
instance = new SingletonHungrySec();
}
}
}
return instance;
}
}
以上這種寫法,通過synchronized關鍵字,在創建實例對象時,進行雙重校驗,確保了對象的唯一性。
當然,也可以在方法的定義上加synchrozied關鍵字,只是多了不必要的同步,每次getInstance()時,都需要加鎖解鎖操作。
public class SingletonFull {
private static final SingletonFull instance = new SingletonFull();
private SingletonFull() {
}
public static SingletonFull getInstance (){
return instance;
}
}
上面這樣的寫法是飽漢式,即在聲明屬性的時候已經創建了實例對象,後續程序中只需要調用獲取即可,但是這種方式並沒有達到lazy loader的效果。