思想:
相比於餓漢模式,懶漢模式實際中的應用更多,因為在系統中,「被用到時再初始化」是更佳的解決方案。
設計思想與餓漢模式類似,同樣是持有乙個自身的引用,只是將 new 的動作延遲到 getinstance() 方法中執行。
publicfinal
class
lazysingleton
}public
static
synchronized
lazysingleton getinstance()
return
instance;
}}
對於 lazysingleton,這是個很有趣的問題,雖然我們在私有構造器中增加了 instance==null 的判斷,但是由於延遲載入的原因,使得它無法完美地規避反射的入侵。
這涉及到了反射入侵和 getinstance() 方法呼叫順序的問題。
如果在呼叫 getinstance() 方法之前進行反射入侵,那麼就會打破單例,反之,可以保證單例。
publicclass
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 延遲...