單例模式使用場景:當程式執行時,需要保證乙個物件只有乙個例項存在時,就應該使用單例模式
經典場景:資料庫連線池的例項,在我們使用資料庫連線池不可能每使用一次 都去建立乙個連線池,所以需要保證程式在執行的時候只存在乙個例項
單例模式的建立分成懶漢式和餓漢式
餓漢式的優點:寫法簡單,返回物件方便 缺點:沒有實現懶載入,如果沒有用到這個類就會造成記憶體的浪費
餓漢式寫法如下:
public class singleton
public static singleton getinstance()
}
這樣子是餓漢式的一種寫法,因為在類載入的時候執行緒是安全的,所以這樣子可以實現單例模式。
第二種餓漢式寫法,使用靜態**塊實現:
public class singleton
private singleton()
public static singleton getinstance()
}
這種也是依賴與類載入的時候執行緒安全,他會載入靜態**塊的內容,所以也可以實現單例模式
懶漢式:
第一種是採用雙檢測鎖實現:
public class singleton
public static singleton getinstance() }}
return instance;
}}
採用雙重鎖來實現,即實現了懶載入,效率也高。
需要注意這邊 給類 加上了 volatile 關鍵字
關於 volatile 關鍵字在這邊的作用 有以下作用
1、volatile 在這邊保證了類初始化過程不會產生重排序、
重排序就是計算機為了提高執行效率,會做的一些優化,在不影響最終結果的情況下,可能會對一些語句的執行順序進行調整。
instance = new singleton(); 這句**有三個執行步驟
1、給物件分配記憶體空間
2、執行物件構造方法
3、將instance指向分配的記憶體空間 (這步執行完 instance 就不為null)
所以 可能 會出現 1->2->3 也會出現 1->3->2
如果出現 1->3->2 就有可能有的執行緒獲得還沒有初始化完成的物件就會產生錯誤
第二種實現的是靜態內部類
public class singleton
public static singleton getinstance()
private static class singletonholder
}
這樣子寫法簡單,也實現了懶載入,因為當singleton被裝載的時候,singletonholder 也不會被初始化
還有一種是使用列舉來實現單例模式,只是也沒有實現懶載入,但是實現起來簡單也簡潔
**如下
public enum singleton
}
是不是看起來非常簡潔 學習設計模式 單例模式
適用於 優點 缺點 1.懶漢式 public class singleton public static synchronized singleton getinstance return uniqueinstance 2.餓漢式 public class singleton public stat...
設計模式學習 單例模式
單例模式是一種常用的軟體設計模式。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。1.單例模式特點 2.單例模式作用 3.單例模式種類 a.餓漢式 b.懶漢式 c.懶漢式 ...
學習設計模式( ) 單例模式
定義 確保乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。型別 建立類模式 單例模式應該是23種設計模式中最簡單的一種模式了。它有以下幾個要素 單例模式現在主流推薦第一種雙重檢查型。以前流行的有根據例項化物件時機的不同有分為兩種 一種是餓漢式單例,一種是懶漢式單例。餓漢式單例在單例類被載...