using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace SingletonDemo { public sealed class Singleton { private Singleton() { } private static Singleton ins = null; private static object obj = new object(); public static Singleton Instance { get { if (ins == null) { System.Threading.Thread.Sleep(1000); lock (obj) { if (ins == null) { ins = new Singleton(); } } } return ins; } } public void SaySth() { Console.WriteLine("hello"); } public int MyProperty { get; set; } } class Program { static Singleton sin1 = null, sin2 = null; static bool b = false; static void GetInstance( object obj) { if (b==false) { b = true; sin1 = Singleton.Instance; } else { sin2 = Singleton.Instance; } (obj as ManualResetEvent).Set(); } static void Main(string[] args) { //Singleton s1 = new Singleton(); //Singleton s2 = new Singleton(); //Singleton ins = Singleton.Instance; //ins.SaySth(); //ins.MyProperty = 13; //Console.WriteLine(ins.MyProperty); //Console.WriteLine("--------------------"); //Singleton ins2 = Singleton.Instance; //ins2.SaySth(); //Console.WriteLine(ins2.MyProperty); //bool b = Object.ReferenceEquals(ins, ins2); //Console.WriteLine(b); ManualResetEvent[] manualEvents = new ManualResetEvent[2]; manualEvents[0] = new ManualResetEvent(false); manualEvents[1] = new ManualResetEvent(false); Thread thread1 = new Thread( new ParameterizedThreadStart(GetInstance)); Thread thread2 = new Thread( new ParameterizedThreadStart(GetInstance)); thread1.Start(manualEvents[0]); thread2.Start(manualEvents[1]); WaitHandle.WaitAll(manualEvents); //ThreadPool.QueueUserWorkItem(GetInstance, manualEvents[0]); //ThreadPool.QueueUserWorkItem(GetInstance, manualEvents[1]); sin1.SaySth(); sin2.SaySth(); sin1.MyProperty = 1; sin2.MyProperty = 2; bool b = Object.ReferenceEquals(sin1, sin2); Console.WriteLine(b); Console.WriteLine("sin1:" + sin1.MyProperty); Console.WriteLine("sin2:" + sin2.MyProperty); Console.ReadKey(); } } }