定義:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
三種寫法:
(1)懶漢式
public class singletonlazy
public static singletonlazy getinstance()
return instance;
}}
優點:使用時才建立,節約資源
缺點: 執行緒不安全,因為多執行緒環境下,new singletonlazy()可能會執行多次。
改進1:給getinstance()方法加鎖。
public class singletonlazy
public synchronized static singletonlazy getinstance()
return instance;
}}
問題:多執行緒環境下,雖然能保證單例,但是每個執行緒進入getinstance() 方法時,都會掛起其他的執行緒,即便singletonlazy已經被例項化了,方法也不是立即返回,而synchronzized是有時間代價的,所以效率不高。
改進2:雙重檢查
public class singletondoublecheck
public static singletondoublecheck getinstance()
}return instance;
}}
優點:多執行緒環境下
1. 執行getinstance()方法時,不需要阻塞,如果singletondoublecheck已經被建立,則方法迅速返回物件例項。這是第一層檢查的的作用。
2. 只在singletondoublecheck未被初始化的時候才加鎖,這是比「改進1」效率高的地方。第二層檢查的作用是保證單例。
問題:new singletondoublecheck()不是乙個「原子操作」,就是說這個操作需要n步才能完成,這裡涉及乙個jvm的話題——指令重排序,這就可能導致先修改了instance的值,再執行真正的構造方法。所以,還是有可能出現乙個執行緒未出這個語句塊時,另乙個執行緒進入。(筆者對這個地方,還不太能解釋清楚,先做個標記,後面完善)
改進3:加volatile
public class singletondoublecheck
public static singletondoublecheck getinstance()
}return instance;
}}
(2)餓漢式
public class singletonhungry
public static singletonhungry getinstance()
}
優點:執行緒安全,由jvm load機制保證
缺點:過早浪費資源
(3) 靜態內部類式(推薦使用)
public class singleton
private singleton() {}
private static class singletonholder
}
優點:在使用時才建立例項物件,jvm機制。 建立型設計模式(1) 單例模式
動機 有時候只有乙個類的例項是很重要的。比如,乙個系統應該只有乙個視窗管理例項。單例模式是最簡單設計模式 類負責例項化自己,確保只有乙個例項,並且提供乙個訪問這個例項的入口。目的 1.確保只有乙個例項被建立。2.提供訪問這個例項的入口。實現 使用final確保被建立一次,private的建構函式確保...
設計模式 建立型 單例模式 1
有的 寫過,不再想起 有的 複製貼上後,還將回首。上個專案已經進入收尾,利用年前的閒暇,對設計模式進行乙個較為完整的學習。ok,let s go!建立型 單例模式 如果我們需要保證系統內對於某個類最多只能存在乙個例項的時候,我們就會使用單例模式。例如快取池,資料連線池,執行緒池等。在多執行緒環境下,...
設計模式之單例模式(建立型)
單例模式的核心,就是全域性只有乙個例項。下面就每一種建立方式分析其優缺點。1.餓漢式 餓漢式 public class personhungry public static personhungry getinstance 2.靜態 塊public class person private pers...