對單例模式的理解

2021-09-04 05:42:38 字數 1285 閱讀 8492

單例模式的三個特點:

1、構造方法私有化

2、例項化的變數引用私有化

3、獲取例項的方法共有

什麼是單例

確保這個類在記憶體中只會存在乙個物件,而且自行例項化並向整個應用系統提供這個例項。

應用的場景

建立乙個物件會消耗過多的資源, 比如訪問io和資料庫

有哪幾種方式   推薦用靜態內部類或加了volatile關鍵字的雙重檢查單例

1 餓漢式   在類載入的時候就對例項進行建立

優點: 執行緒安全,多個執行緒不會建立多個例項,  缺點:不需要的時候也會建立,造成資源浪費

執行緒安全,呼叫效率高,但是不能延時載入

2 懶漢式   在需要的時候才去建立的  加鎖來保證執行緒安全

優點: 使用次數少,建立單例消耗資源多,使用懶漢式比較好   缺點:效率低,第一次載入的時候反應慢,每次呼叫getinstance()方法會進行同步,消耗不必要的資源

執行緒安全,呼叫效率不高,但是能延時載入

3 雙重檢查單例:  多加一次判斷

優點: 資源利用率高, 第一次執行沒有物件才去建立,  缺點:第一次載入會比較慢

由於jvm底層模型原因,偶爾會出問題,不建議使用

第一層判斷的主要避免了不必要的同步,第二層判斷是為了在null的情況下再去建立例項

jdk1.5之前會出現兩個bug(1、執行緒間共享變數不可見性。2、無序性(執行順序無法保證))

jdk1.5之前會出現bug,   已經修復,需要    private volatitle static singleton instance;

4 靜態內部類  在內部類裡面去建立物件例項

優點:應用中不使用內部類,就不會建立物件,實現了餓漢式的延遲載入,利用類載入機制,不存在多執行緒併發的問題.

執行緒安全,呼叫效率高,可以延時載入

5 列舉實現單例

寫法比較簡單,任何方式下都是單例的

執行緒安全,呼叫效率高,不能延時載入,可以天然的防止反射和反序列化呼叫

執行緒安全方面,類似於普通的餓漢模式,通過在第一次呼叫時的靜態初始化建立的物件是執行緒安全的。

序列化方面  列舉的readobject是被編譯器禁用的, 因此也不存在實現序列化介面後呼叫readobject會破壞單例的問題。

反射  列舉類不能在外部例項化物件, abstract類不可以例項化物件  constructor的newinstance方法會判斷是否是列舉,是的話丟擲異常.

如何選用:

-單例物件 占用資源少,不需要延時載入,列舉 好於 餓漢

-單例物件 占用資源多,需要延時載入,靜態內部類 好於 懶漢式

我對單例模式的理解

一.概念 單件模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。單例模式只應在有真正的 單一例項 的需求時才可使用。二.舉例子 單例分為餓漢式和懶漢式。一般餓漢式 public class singleton private static singleton singleton new sing...

對單例設計模式的理解

單例設計模式,顧名思義,是指這個類裡面只能有乙個例項化物件,所有外部類想訪問他那麼都只能訪問這個物件 其餓漢式設計 如下 class single 其懶漢式設計 如下 class single return s 其中single.class指的是申明了這是個物件,因為synchronized 裡面要...

對C 單例模式的理解

一 單例模式的定義 確保乙個類只有乙個例項,並提供乙個全域性訪問點來訪問這個唯一的例項,是一種物件建立型模式,有如下3個要點 二 單例模式的結構 1 class singletonclass 2 8 9 public static singletonclass getinstance 公有靜態方法,...