程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# Singleton 如何實現多線程多實例,每個線程中有且只有一個實例

C# Singleton 如何實現多線程多實例,每個線程中有且只有一個實例

編輯:C#入門知識

以前項目中使用的單例一直是用的最簡單的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等方法也測試過,也是始終是同一個實例)

  \


摘自  天羽

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved