文章目錄
單例模式特點
- private的構造方法
- public的方法獲取實例
應用場景
- 程序生命週期中只有一個對象
- 需要頻繁創建和銷燬的對象
- 創建時耗費資源過多,卻又使用頻率較高的對象
C#版的各種單例模式
飢餓加載
懶加載模式
懶加載+簡單線程安全
懶加載+線程安全(雙重驗證)
內部類實現單例
各種版本的性能如下:
下圖時循環20億次的耗時
從圖中可看出內部類方式效率最高,簡單線程安全耗時最高,因爲每次在調用Instance時都要使用lock進行加鎖,而加鎖這個操作是耗費資源的,線程安全模式也是用了lock,但是在lock之前進行了非空驗證,效率大大提升。因此推薦使用內部類和雙重驗證的懶加載模式
在多線程程序中,使用volatile關鍵字來確保線程安全單例模式是真正的安全,多線程同時訪問一個變量,CLR(Common Language Runtime 公共語言運行時)爲了提高效率,允許每個線程進行本地緩存,這就導致了變量的不一致性,volatile就是爲了解決這個問題,不允許進行本地緩存,每個線程對這個變量的讀寫都是在共享內存中進行,保證變量的一致性
結合工廠模式的單例模式
變量如下
雙重驗證的線程安全單例
簡單的線程安全單例
非線程安全的單例
內部類單例
循環10億次,耗時如下:
從圖中看出簡單線程安全的單例耗時最久,也是因爲每次調用Instance時,使用了lock進行加鎖操作。內部類和線程安全的耗時相差不大,和上面的測試結果類似,推薦使用內部類和線程安全兩種方式的單例