C# Singleton 如何实现多线程多实例,每个线程中有且只有一个实例。

以前项目中使用的单例一直是用的最简单的C#写法,是Thread Safe的,多线程下只会有一个实例。代码如下:

 

public sealed class Singleton
{
public static readonly Singleton Instance = new Singleton();
private Singleton() { }
}

最近项目有了新的需求,需要多个线程中实现多个实例,最好是在每个线程中是单例的。于是修改代码为最基本的实现,这种最基本的实现方法在网上几乎所有的中英文资料都是众口一词的说这种方法在多个线程下会开多个实例,但结果。。。无论如何,永远是单实例,百思不得其解,代码如下,请大家指正。测试环境为Windows 7 64bit, VS2010, .net framework 4.0

Class Singleton:

 1 public class Singleton : ICloneable
2 {
5 private static Singleton instance;
6 public static Singleton Instance
7 {
8 get
9 {
10 if (instance == null)
11 instance = new Singleton();
12 return instance;
13
14 }
15 }
16
17 private string instanceID;
18
19 private Singleton()
20 {
21 // 随机返回一个ID,来证明此实例是否为同一个。
22 instanceID = new Random().Next().ToString();
23 }
24
25 public void GetInstanceID()
26 {
27 System.Threading.Thread.Sleep(3000);
28 MessageBox.Show("Instance ID: " + instanceID);
29 }
30
31 public object Clone()
32 {
33 return new Singleton();
34 }
35 }
ICloneable 是为了多个线程中能实现多实例而实现的,但依然不行。开始时是没有实现ICloneable接口的,但也不行。
Form1中的调用代码 :
1 private void button1_Click(object sender, EventArgs e)
2 {
3 Singleton.Instance.GetInstanceID();
4 new System.Threading.Tasks.TaskFactory().StartNew(() =>
5 {
6 Singleton.Instance.GetInstanceID();
7 });
8
9 }
结果,在当前线程下得到IstanceID之后,多线程里的InstanceID 始终是同一个,证明在其他线程中并没有产生新的实例,是我的实现方法有问题,还是什么原因呢?请大家指正。
运行结果如下:(使用backgroudnworker等方法也测试过,也是始终是同一个实例)

posted @ 2012-03-17 05:20  AndyLiu  阅读(795)  评论(7编辑  收藏  举报