天天看點

設計模式---單例模式 (轉)

 看别人寫的設計模式 覺得很好。

 引用别人的 自己就不造輪子了。。。。。

單例模式:

三個要點:

1.某個類隻能有一個執行個體。

2.它必須自行建立這個執行個體;

3.它必須自行向外提供這個執行個體。

餓漢式:

 優點:

    1.線程安全

    2.在類加載的同時已經建立好一個靜态對象,調用時反應速度快

缺點:

      資源效率不高,可能getInstance()永遠不會執行到,但執行該類的其他靜态方法或者加載了該類(class.forName),那麼這個執行個體仍然初始化 

懶漢式: (懶加載的思想,用到才會初始化執行個體)

資源使用率高,不執行getInstance()就不會被執行個體,可以執行該類的其他靜态方法

    第一次加載時不夠快,多線程使用不必要的同步開銷大

比較:

餓漢式是線程安全的,在類建立的同時就已經建立好一個靜态的對象供系統使用,以後不再改變。

懶漢式如果在建立執行個體對象時不加上synchronized則會導緻對對象的通路不是線程安全的,

推薦使用第一種

  假設多線程通路的時候,線程1在在new Instence() 系統配置設定記憶體需要0.01秒時間 ,但就這這個0.01秒 又有其他的線程通路了,這時候就要再次instance 還是為null  又要再次new

  導緻了線程不安全。

雙重檢測:

優點:

資源使用率高,不執行getInstance()就不被執行個體,可以執行該類其他靜态方法

    第一次加載時反應不快,由于java記憶體模型一些原因偶爾失敗

靜态内部類:

優點:

    資源使用率高,不執行getInstance()不被執行個體,可以執行該類其他靜态方法

缺點:

    第一次加載時反應不夠快