1 .简单实现
2 {
3 static Singleton instance = null ;
4
5 Singleton()
6 {
7 }
8
9 public static Singleton Instance
10 {
11 get
12 {
13 if (instance == null )
14 {
15 instance = new Singleton();
16 }
17 return instance;
18 }
19 }
20 }
这种方式的实现对于线程来说并不是安全的,因为在多线程的环境下有可能得到 Singleton类的多个实例。如果同时有两个线程去判断(instance == null),并且得到的结果为真,这时两个线程都会创建类Singleton的实例,这样就违背了Singleton模式的原则。实际上在上述代码中,有 可能在计算出表达式的值之前,对象实例已经被创建,但是内存模型并不能保证对象实例在第二个线程创建之前被发现。
该实现方式主要有两个优点:
l 由于实例是在 Instance 属性方法内部创建的,因此类可以使用附加功能(例如,对子类进行实例化),即使它可能引入不想要的依赖性。
l 直到对象要求产生一个实例才执行实例化;这种方法称为“惰性实例化”。惰性实例化避免了在应用程序启动时实例化不必要的 singleton 。
2 .安全的线程
2 {
3 static Singleton instance = null ;
4 static readonly object padlock = new object ();
5
6 Singleton()
7 {
8 }
9
10 public static Singleton Instance
11 {
12 get
13 {
14 lock (padlock)
15 {
16 if (instance == null )
17 {
18 instance = new Singleton();
19 }
20 return instance;
21 }
22 }
23 }
24 }
25
26
这 种方式的实现对于线程来说是安全的。我们首先创建了一个进程辅助对象,线程在进入时先对辅助对象加锁然后再检测对象是否被创建,这样可以确保只有一个实例 被创建,因为在同一个时刻加了锁的那部分程序只有一个线程可以进入。这种情况下,对象实例由最先进入的那个线程创建,后来的线程在进入时( instence == null )为假,不会再去创建对象实例了。但是这种实现方式增加了额外的开销,损失了性能。
2 {
3 static Singleton instance = null ;
4 static readonly object padlock = new object ();
5
6 Singleton()
7 {
8 }
9
10 public static Singleton Instance
11 {
12 get
13 {
14 if (instance == null )
15 {
16 lock (padlock)
17 {
18 if (instance == null )
19 {
20 instance = new Singleton();
21 }
22 }
23 }
24 return instance;
25 }
26 }
27 }
28
2 {
3 static readonly Singleton instance = new Singleton();
4
5 static Singleton()
6 {
7 }
8
9 Singleton()
10 {
11 }
12
13 public static Singleton Instance
14 {
15 get
16 {
17 return instance;
18 }
19 }
20 }
21
现方式。
2 {
3 Singleton()
4 {
5 }
6
7 public static Singleton Instance
8 {
9 get
10 {
11 return Nested.instance;
12 }
13 }
14
15 class Nested
16 {
17 static Nested()
18 {
19 }
20
21 internal static readonly Singleton instance = new Singleton();
22 }
23 }
24
l Singleton模式是限制而不是改进类的创建。
对象实例,但这样会导致 Singleton 类中出现悬浮引用。
源码下载:/Files/Terrylee/SigletonPattern.rar
2 using System.Threading;
3
4 namespace SigletonPattern.SigletonCounter
5 {
6 /// <summary>
7 /// 功能:简单计数器的单件模式
8 /// 编写:Terrylee
9 /// 日期:2005年12月06日
10 /// </summary>
11 public class CountSigleton
12 {
13 /// 存储唯一的实例
14 static CountSigleton uniCounter = new CountSigleton();
15
16 /// 存储计数值
17 private int totNum = 0 ;
18
19 private CountSigleton()
20
21 {
22 /// 线程延迟2000毫秒
23 Thread.Sleep( 2000 );
24 }
25
26 static public CountSigleton Instance()
27
28 {
29
30 return uniCounter;
31
32 }
33
34 /// 计数加1
35 public void Add()
36 {
37 totNum ++ ;
38 }
39
40 /// 获得当前计数值
41 public int GetCounter()
42 {
43 return totNum;
44 }
45
46 }
47 }
48
2 using System.Threading;
3 using System.Text;
4
5 namespace SigletonPattern.SigletonCounter
6 {
7 /// <summary>
8 /// 功能:创建一个多线程计数的类
9 /// 编写:Terrylee
10 /// 日期:2005年12月06日
11 /// </summary>
12 public class CountMutilThread
13 {
14 public CountMutilThread()
15 {
16
17 }
18
19 /// <summary>
20 /// 线程工作
21 /// </summary>
22 public static void DoSomeWork()
23 {
24 /// 构造显示字符串
25 string results = "" ;
26
27 /// 创建一个Sigleton实例
28 CountSigleton MyCounter = CountSigleton.Instance();
29
30 /// 循环调用四次
31 for ( int i = 1 ;i < 5 ;i ++ )
32 {
33 /// 开始计数
34 MyCounter.Add();
35
36 results += " 线程 " ;
37 results += Thread.CurrentThread.Name.ToString() + " ——〉 " ;
38 results += " 当前的计数: " ;
39 results += MyCounter.GetCounter().ToString();
40 results += " /n " ;
41
42 Console.WriteLine(results);
43
44 /// 清空显示字符串
45 results = "" ;
46 }
47 }
48
49 public void StartMain()
50 {
51
52 Thread thread0 = Thread.CurrentThread;
53
54 thread0.Name = " Thread 0 " ;
55
56 Thread thread1 = new Thread( new ThreadStart(DoSomeWork));
57
58 thread1.Name = " Thread 1 " ;
59
60 Thread thread2 = new Thread( new ThreadStart(DoSomeWork));
61
62 thread2.Name = " Thread 2 " ;
63
64 Thread thread3 = new Thread( new ThreadStart(DoSomeWork));
65
66 thread3.Name = " Thread 3 " ;
67
68 thread1.Start();
69
70 thread2.Start();
71
72 thread3.Start();
73
74 /// 线程0也只执行和其他线程相同的工作
75 DoSomeWork();
76 }
77 }
78 }
79
2 using System.Text;
3 using System.Threading;
4
5 namespace SigletonPattern.SigletonCounter
6 {
7 /// <summary>
8 /// 功能:实现多线程计数器的客户端
9 /// 编写:Terrylee
10 /// 日期:2005年12月06日
11 /// </summary>
12 public class CountClient
13 {
14 public static void Main( string [] args)
15 {
16 CountMutilThread cmt = new CountMutilThread();
17
18 cmt.StartMain();
19
20 Console.ReadLine();
21 }
22 }
23 }
24
2 {
3 static Singleton instance = null ;
4 static readonly object padlock = new object ();
5
6 Singleton()
7 {
8 }
9
10 public static Singleton Instance
11 {
12 get
13 {
14 lock (padlock)
15 {
16 if (instance == null )
17 {
18 instance = new Singleton();
19 }
20 return instance;
21 }
22 }
23 }
24 }
25
26
2 {
3 static Singleton instance = null ;
4
5 Singleton()
6 {
7 }
8
9 public static Singleton Instance
10 {
11 get
12 {
13 if (instance == null )
14 {
15 instance = new Singleton();
16 }
17 return instance;
18 }
19 }
20 }