單例模式(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都是單例。單例模式的特點 從系統啟動到終止,整個過程只會產生乙個例項。單例模式常用寫法 懶漢式,餓漢式,註冊式,序...