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接口的,但也不行。www.2cto.com
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等方法也测试过,也是始终是同一个实例)

\


摘自  天羽

转载地址: http://www.2cto.com/kf/201203/123533.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值