单件模式(Singleton Pattern)

意图

保证一个类仅有一个实例,并提供一个该实例的全局访问点

可将一个实例扩展到n个实例。限定某类最多只能创建n个实例。

一。双重锁定实现单件模式

public sealed class Singleton

{

    private static volatile Singleton instance = null;

    private static readonly object lockHelper = new object();



    private Singleton() { }



    public static Singleton Instance

    {

        get

        {

            if (instance == null)

            {

                lock (lockHelper)

                {

                    if (instance == null)

                    {

                        instance = new Singleton();

                    }

                }

            }

            return instance;

        }

    }

}

解决了线程并发问题,同时避免在每个 Instance 属性方法的调用中都出现独占锁定。还实现了惰性实例化。

volatile修饰:编译器在编译代码的时候会对代码的顺序进行微调,用volatile修饰保证了严格意义的顺序。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

 

二。 延迟初始化

public sealed class Singleton

{

    public static Singleton Instance

    {

        get

        {

            return Nested.instance;

        }

    }

    private Singleton() { }



    class Nested

    {

        internal static readonly Singleton instance = new Singleton();

        static Nested() { }

    }

}

 

 三。内联初始化(利用.net初始化机制),在.NET里静态构造器只能声明一个,而且必须是无参数的,私有的。因此这种方式只适用于无参数的构造器。

public sealed class Singleton

{

    public static Singleton Instance = new Singleton();

    private Singleton() { }

}

 等同于

public sealed class Singleton

{

    public static Singleton Instance;

    private Singleton() { }

    static Singleton()

    {

        Instance = new Singleton();

    }

}

 

 四个线程共用一个计数器(转)

using System;

using System.Threading;



namespace SigletonPattern.SigletonCounter

{

	/// <summary>

	/// 功能:简单计数器的单件模式

	/// 编写:Terrylee

	/// 日期:2005年12月06日

	/// </summary>

	public class CountSigleton

	{

		///存储唯一的实例

		static CountSigleton uniCounter = new CountSigleton();  

   

		///存储计数值

		private int totNum = 0;  

   

		private CountSigleton() 

   

		{ 

			///线程延迟2000毫秒

			Thread.Sleep(2000);

		} 

   

		static public CountSigleton Instance() 

   

		{ 

   

			return uniCounter; 

   

		} 

		

		///计数加1

		public void Add()

		{ 

			totNum ++;

		}  

		

		///获得当前计数值

		public int GetCounter()

		{ 

			return totNum;

		} 



	}

}



using System;

using System.Threading;

using System.Text;



namespace SigletonPattern.SigletonCounter

{

	/// <summary>

	/// 功能:创建一个多线程计数的类

	/// 编写:Terrylee

	/// 日期:2005年12月06日

	/// </summary>

	public class CountMutilThread

	{

		public CountMutilThread()

		{

			

		}



		/// <summary>

		/// 线程工作

		/// </summary>

		public static void DoSomeWork()

		{

			///构造显示字符串

			string results = "";



			///创建一个Sigleton实例

			CountSigleton MyCounter = CountSigleton.Instance();



			///循环调用四次

			for(int i=1;i<5;i++)

            {

                Thread.Sleep(1000);

				///开始计数

				MyCounter.Add();

                

				results +="线程";

                results += Thread.CurrentThread.Name.ToString() + "——〉";

				results += "当前的计数:";

				results += MyCounter.GetCounter().ToString();

				results += "\n";



				Console.WriteLine(results);

				

				///清空显示字符串

				results = "";

			}

		}



		public void StartMain()

		{



			Thread thread0 = Thread.CurrentThread; 

   

			thread0.Name = "Thread 0"; 

   

			Thread thread1 =new Thread(new ThreadStart(DoSomeWork)); 

   

			thread1.Name = "Thread 1"; 

   

			Thread thread2 =new Thread(new ThreadStart(DoSomeWork)); 

   

			thread2.Name = "Thread 2"; 

   

			Thread thread3 =new Thread(new ThreadStart(DoSomeWork)); 

   

			thread3.Name = "Thread 3"; 

   

			thread1.Start(); 



			thread2.Start(); 

   

			thread3.Start(); 

			

			///线程0也只执行和其他线程相同的工作

			DoSomeWork(); 

		}

	}

}



using System;

using System.Text;

using System.Threading;



namespace SigletonPattern.SigletonCounter

{

	/// <summary>

	/// 功能:实现多线程计数器的客户端

	/// 编写:Terrylee

	/// 日期:2005年12月06日

	/// </summary>

	public class CountClient

	{

		public static void Main(string[] args)

		{

			CountMutilThread cmt = new CountMutilThread();



			cmt.StartMain();



			Console.ReadLine();

		}

	}

}

 

 

 

 

你可能感兴趣的:(Singleton)