設計模式之單例模式

2021-09-02 23:35:57 字數 1929 閱讀 3168

1.什麼是單例

保證在乙個jvm中,只能存在乙個例項,保證物件唯一性。(只能建立乙個物件無法通過new方式建立物件)

2.應用場景

servlet、struts2、springmvc、連線池、執行緒池、spring(預設單例)

3.單例的優缺點

1)好處:節約記憶體,重複利用,方便管理

2)缺點:執行緒安全問題

4.單例有幾種建立方式

1)餓漢式:類初始化時,會立即載入物件,執行緒天生安全,呼叫效率高。

package com.single;

//餓漢式

public class singletondemo

public singletondemo getinstance()

}

2)懶漢式:類初始化時,不會初始化該物件,真正需要的時候才會建立。

package com.single;

//懶漢式:類初始化的時候不會建立物件,等需要的時候才會建立,天生執行緒不安全,需要解決執行緒安全問題,所以效率較低

public class singletondemo

//synchronized解決執行緒安全問題,但是效率會降低,方法變成靜態同步函式了

public static synchronized singletondemo getinstance()

return singletondemo;

}}

3)靜態內部類方式:結合了以上兩點的優點,可以實現延時載入,並且是執行緒安全的。

package com.single;

//靜態內部類方式 有點:延時載入、天生執行緒安全、真正需要才會去建立

public class singletondemo

//內部類需要外部類呼叫內部類才會初始化,所以可以實現延時載入功能

public static class singletonclassinstance

public static singletondemo getinstance()

}

4)列舉單例:使用列舉實現單例 優點:實現簡單、呼叫效率高,列舉本身就是單例,可以避免反射和反序列化,缺點沒有延時載入

package com.single;

//列舉單例:天生具備jvm保障在jvm中只會存在乙個,還可以防止反射攻擊

public class singletondemo

public static singletondemo getinstance()

static enum singletondemoeum

public singletondemo getinstance()

}}

5)雙重檢測鎖方式(因為jvm重排序的原因,可能初始化多次不推薦使用)

package com.single;

//雙重檢測鎖方式

public class singletondemo

//執行緒安全 效率低

public static singletondemo getinstance()

}} return singletondemo;

}}

5.單例如何防止反射漏洞攻擊

在建構函式中,只能潤徐初始化一次,做乙個標記,如果已經初始化改為ture,建立新物件的時候當標記為true說明已經被建立

package com.single;

public class singletondemo else

}}

6.如何選擇單例建立方式

如果不需要延遲載入,可以使用列舉或者餓漢式,相對來說列舉性好於餓漢式。如果需要延遲載入,可以使用靜態內部類或者懶漢式,相對來說靜態內部類好於懶漢式。最好使用餓漢式

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...