單例模式的三種寫法和優缺點
阿新 • • 發佈:2017-12-09
兩種 system 一個 obj cti sin clr 效果 returns
1 using System;
2 using System.Collections.Generic;
3
4 namespace ConsoleApp1
5 {
6 class Singleton
7 {
8 private static Singleton _singleton = null;
9 private static object singleton_Lock = new object(); //對象鎖
10
11 /// <summary>
12 /// 標準的單例模式
13 /// </summary>
14 /// <returns></returns>
15 public static Singleton CreateInstance()
16 {
17 if (_singleton == null)//保證對象初始化化之後的所有線程,不需要等待鎖
18 {
19 lock (singleton_Lock)//保證只有一個線程進去判斷
20 {
21 if (_singleton == null)//保證對象為空才創建
22 {
23 _singleton = new Singleton();
24 }
25 }
26 }
27 return _singleton;
28 }
29 }//Class_end
30 }
第一種單例的寫法,是用兩個if加一個Lock來優化在多線程情況下調用單例的耗時,而下面是第二種寫法(下圖),效果一樣,但更加簡單
1 using System;
2 using System.Collections.Generic;
3
4 namespace ConsoleApp1
5 {
6 class Singleton
7 {
8 private static Singleton _Singleton = null;
9
10 /// <summary>
11 /// 靜態構造函數:由CLR保證,在第一次調用之前調用,只調用一次
12 /// </summary>
13 static Singleton()
14 {
15 _Singleton = new Singleton();
16 }
17
18 public static Singleton CreateInstance()
19 {
20 return _Singleton;
21 }
22 }//Class_end
23 }
第三種單例的寫法更簡單,直接在聲明靜態變量的時候創建實例化類
1 using System;
2 using System.Collections.Generic;
3
4 namespace ConsoleApp1
5 {
6 class Singleton
7 {
8 //靜態變量會在類型第一次使用的時候初始化,而且只初始化一次
9 private static Singleton _singleton = new Singleton();
10 public static Singleton CreateInstance()
11 {
12 return _singleton;
13 }
14 }//class_end
15 }
這三種單例的寫法,其實效果都一樣,只是後面兩種是由系統CLR幫我們調用創建實例類。
單例的優點是:保證整個進程中該對象只被實例化一次,減少性能消耗
缺點是:常駐內存,不會被GC回收(普通類型需要的時候就初始化,用完被GC自動回收),而且過多使用單例,而單例類本身帶有公有變量,就會很容易造成嚴重的問題
單例模式的三種寫法和優缺點