java懒加载设计模式_java设计模式——单例模式
整理一下設計模式的個人理解。
描述
單例模式是java中比較常見的一種設計模式,顧名思義為一個類只能創建一個實例,多用于全局對象,如:配置的加載,spring?bean加載各種配置(spring容器所有bean默認都是單例)
單例的特點為構造方法私有,因此必須內部進行實例化,并提供靜態訪問方法為其他對象提供該實例。即:
1、單例只能有一個實例
2、單例構造方法私有
3、單例必須自己創建唯一實例,并提供其他對象訪問該實例的靜態方法
優缺點
優點:由于單例模式只生成了一個實例,所以能夠節約系統資源,減少性能開銷,提高系統效率,同時也能夠嚴格控制客戶對它的訪問。
缺點:因為系統中只有一個實例,這樣就導致了單例類的職責過重,違背了“單一職責原則”,沒有接口,不能繼承,不方便擴展。
實現
1> 懶漢式-線程不安全
public classSingleton1 {private staticSingleton1 instance;/*** 構造方法私有*/
privateSingleton1() {
}/*** 提供靜態訪問實例方法
* 懶加載,其他地方用到該實例時調用該方法/創建實例,多線程時可能會創建多個實例,線程不安全
*
*@return
*/
public staticSingleton1 getInstance() {if (instance == null) {
instance= newSingleton1();
}returninstance;
}
}
上述單例在多線程下會存在線程安全問題,比較直觀的解決方案是直接在方法上加同步鎖,以保證只會創建一個實例
2> 懶漢式-線程安全(增加同步鎖,多線程排隊等待,會影響效率)
public classSingleton2 {private staticSingleton2 instance;/*** 構造方法私有*/
privateSingleton2() {
}/*** 提供靜態訪問實例方法
* 懶加載,其他地方用到該實例時調用該方法/創建實例,增加同步鎖,保證線程安全
*
*@return
*/
public static synchronizedSingleton2 getInstance() {if (instance == null) {
instance= newSingleton2();
}returninstance;
}
}
3>?餓漢式(類加載時創建,線程安全)
類加載時即創建實例,后續直接獲取該實例,好處為永遠保持唯一線程安全,壞處為即使該實例永遠也用不到也會創建,浪費內存資源。
備注:考慮到規范,正常如果是永遠不用的實例,就應該刪除,所以一般也比較推薦使用餓漢式創建單例
public classSingleton3 {//直接實例化
private static Singleton3 instance = newSingleton3();privateSingleton3() {
}/*** 直接返回已實例化的實例
*
*@return
*/
public staticSingleton3 getInstance() {returninstance;
}
}
4>?雙重校驗鎖
instance聲明為volatile線程可見,以防止重排序造成線程不安全(重排序參考:https://blog.csdn.net/ym123456677/article/details/79700623)
public classSingleton4 {//volatile 全局線程可見
private volatile staticSingleton4 instance;privateSingleton4() {
}/*** 獲取實例 -- 雙重校驗,先判斷實例是否存在,不存在對類增加同步鎖,保證只創建一次
*
*@return
*/
public staticSingleton4 getInstance() {if (instance == null) {synchronized (Singleton4.class) {if (instance == null) {
instance= newSingleton4();
}
}
}returninstance;
}
}
5>?靜態內部類(明確指定要實現懶加載時使用)
public classSingleton5 {private static classinner {//聲明為final 不可變
private static final Singleton5 INSTANCE = newSingleton5();
}privateSingleton5() {
}/*** 獲取實例 -- (懶加載)第一個線程進來時就創建實例,并賦值給final常量INSTANCE,后續任何線程調用該方法,直接獲取INSTANCE
*
*@return
*/
public staticSingleton5 getInstance() {returninner.INSTANCE;
}
}
6>?枚舉
枚舉為單例的最佳實踐
public enumSingleton6 {
RED,
GREEN,
BLACK
}
考慮到實際應用,單例一般情況下使用餓漢式,明確要求實現懶加載時使用靜態內部類,不過在實際應用中,單獨使用的單例都不多了,配置一般都是通過spring?bean的方式配置config,枚舉使用較多,對于確定的類型、狀態等,直接使用枚舉。
總結
以上是生活随笔為你收集整理的java懒加载设计模式_java设计模式——单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android java 实体类 obj
- 下一篇: spring中的设计模式_面试:设计模式