C#中各個版本的單例實現(工廠+單例)

單例模式特點

  • private的構造方法
  • public的方法獲取實例

應用場景

  • 程序生命週期中只有一個對象
  • 需要頻繁創建和銷燬的對象
  • 創建時耗費資源過多,卻又使用頻率較高的對象

C#版的各種單例模式

飢餓加載


懶加載模式


懶加載+簡單線程安全


懶加載+線程安全(雙重驗證)


內部類實現單例

各種版本的性能如下:
下圖時循環20億次的耗時

從圖中可看出內部類方式效率最高,簡單線程安全耗時最高,因爲每次在調用Instance時都要使用lock進行加鎖,而加鎖這個操作是耗費資源的,線程安全模式也是用了lock,但是在lock之前進行了非空驗證,效率大大提升。因此推薦使用內部類雙重驗證的懶加載模式

在多線程程序中,使用volatile關鍵字來確保線程安全單例模式是真正的安全,多線程同時訪問一個變量,CLR(Common Language Runtime 公共語言運行時)爲了提高效率,允許每個線程進行本地緩存,這就導致了變量的不一致性,volatile就是爲了解決這個問題,不允許進行本地緩存,每個線程對這個變量的讀寫都是在共享內存中進行,保證變量的一致性


結合工廠模式的單例模式

變量如下


雙重驗證的線程安全單例


簡單的線程安全單例


非線程安全的單例


內部類單例

循環10億次,耗時如下:

從圖中看出簡單線程安全的單例耗時最久,也是因爲每次調用Instance時,使用了lock進行加鎖操作。內部類和線程安全的耗時相差不大,和上面的測試結果類似,推薦使用內部類和線程安全兩種方式的單例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章