設計模式(一)單例模式 2 懶漢模式(Lazy)

2022-06-05 18:54:08 字數 917 閱讀 6509

思想:

相比於餓漢模式,懶漢模式實際中的應用更多,因為在系統中,「被用到時再初始化」是更佳的解決方案。

設計思想與餓漢模式類似,同樣是持有乙個自身的引用,只是將 new 的動作延遲到 getinstance() 方法中執行。

public

final

class

lazysingleton

}public

static

synchronized

lazysingleton getinstance()

return

instance;

}}

對於 lazysingleton,這是個很有趣的問題,雖然我們在私有構造器中增加了 instance==null 的判斷,但是由於延遲載入的原因,使得它無法完美地規避反射的入侵。

這涉及到了反射入侵和 getinstance() 方法呼叫順序的問題。

如果在呼叫 getinstance() 方法之前進行反射入侵,那麼就會打破單例,反之,可以保證單例。

public

class

lazysingletontest

@test

public

void testreflectfailure() throws

exception

catch

(exception e)

}}

因為是延遲載入,考慮到多執行緒情況,需要對方法同步。

可以使用 synchronized **塊 + double-check locking + volatile 關鍵字,對 lazysingleton 進行深一步優化,詳情見:第003彈:懶漢型單例模式的演變

優勢:延遲載入。

劣勢:不能完全遮蔽反射入侵,而且**較為繁瑣。

單例模式 懶漢模式(2)

第一種懶漢模式是執行緒不安全的,那麼如何使其變成執行緒安全呢?只需要加乙個synchronized關鍵字,如下。第二種寫法 public classsingleton2 private staticsingleton2 instance null public static synchronized...

設計模式 單例模式 懶漢模式 餓漢模式

什麼是單例模式?就是自始至終只有乙個例項,不管new多少次物件,他們都指向同乙個引用。保證整個應用中某個例項有且只能有乙個。比如古代只能有乙個皇帝。一些物件我們只需要乙個,比如 配置檔案 工具類 執行緒池 快取 日誌物件等。如果創作出多個例項,就會導致很多問題,比如占用過多資源,不一致的結果等。單例...

單例模式 懶漢模式

在實際應用中,我們往往希望在使用的時候才進行類的載入,而不希望類初始化的時候就進行載入,所以單例模式又有了另外一種實現,懶漢模式 一.延遲載入 如下 public class myobject public static myobject getinstance return myobject 延遲...