單例模式餓漢式與懶漢式,內部類實現單例模式

2021-10-10 08:40:28 字數 1667 閱讀 9164

單例模式(singleton pattern)是指確保乙個類在任何情況下都絕對持有乙個例項,並提供乙個全域性訪問點。

就是在類載入的時候就立即初始化,並且建立單例物件。絕對的執行緒安全

public

class

hungrysingleton

private

hungrysingleton()

public

static hungrysingleton getinstance()

}

由於不加鎖,執行效率較高。

但在類載入的時候就已經例項化,不管用不用,都在占用記憶體,造成資源浪費。

就是在外部類呼叫的時候才會初始化。

public

class

lazysingleton

public

static lazysingleton getinstance()

return lazy;

}}

該方法僅在單執行緒下執行緒安全。

做一點優化:

public

synchronized

static lazysingleton getinstance()

return lazy;

}

加synchronized後讓方法變為同步方法,實現在多執行緒下的執行緒安全,但仍存在問題。

因為每次呼叫方法獲取例項都會進行加鎖,如果執行緒過多就會影響效率。

再做一點優化:

/**

* 雙重檢查鎖的單例模式

* @return

*/public

static lazysingleton getinstance()

}}return lazy;

}

採用雙重判斷並加鎖機制來實現多執行緒下執行緒安全。

但這樣還是使用了synchronized關鍵字,總歸要上鎖,對程式效能還是存在一定的影響。

public

class

lazyinnerclasssingleton

public

static

final lazyinnerclasssingleton getinstance()

//預設不載入

private

static

class

lazyholder

}

這個形式兼顧了餓漢式模式的記憶體浪費問題和synchronized的效能問題。

這樣就完美了嗎?

當然不是,單例模式的建構函式除了加private關鍵字外,沒有其他任何處理,嘗試使用反射來呼叫其建構函式。

public

static

void

main

(string[

] args)

catch

(exception e)

}

結果列印為false,這並不是單例模式希望看到的,對原來的建構函式再做一些限制,一旦出現多次重複建立,則直接丟擲異常。

private

lazyinnerclasssingleton()

}

單例模式 懶漢式與餓漢式

什麼是單例設計模式 保證這個類的物件永遠有且只有乙個。單例設計模式有兩種 見如下兩種宣告方式 1.懶漢式 設計單例模式 懶漢式 先建立乙個私有的靜態物件 private static user user 建立乙個私有的構造方法 private user 建立乙個公有的靜態的返回物件的方法,需要判斷 ...

單例模式 懶漢式與餓漢式

1 簡述 單例模式 singleton pattern 是一種常用的設計模式,它屬於建立者模式。單例模式只允許有乙個例項,通過建構函式私有化的方式隱藏物件建立入口,取而代之的是提供公共介面用於獲取類的單例。其應用場景廣泛,例如建立管理類 只需要乙個管理實體 或者應用於物件需要限定唯一性的場景等。注意...

單例模式 懶漢式與餓漢式

單例模式屬於建立型模式的一種,應用於保證乙個類僅有乙個例項的場景下,並且提供了乙個訪問它的全域性訪問點,如spring中的全域性訪問點beanfactory,spring下所有的bean都是單例。單例模式的特點 從系統啟動到終止,整個過程只會產生乙個例項。單例模式常用寫法 懶漢式,餓漢式,註冊式,序...