版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CJB_King/article/details/61196167
通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类的自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且塔可以提供一个访问该实例的方法 !
单例模式如图
Singleton类,定义一个GetInstance方法,允许客户访问它的唯一实例,GetInstance是一个静态方法,主要负责创建自己的唯一实例;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 单例模式
{
class Singleton
{
private static Singleton _instance;
private Singleton()
{
}
public static Singleton GetInstance()
{
if(_instance==null)
{
_instance = new Singleton();
}
return _instance;
}
}
class Program
{
static void Main(string[] args)
{
Singleton s1 = Singleton.GetInstance();
Singleton s2 = Singleton.GetInstance();
if(s1==s2)
{
Console.WriteLine("s1=s2");
}
Console.ReadKey();
}
}
多线程时的单例模式:
在多线程程序中,多个线程同时,注意是同时访问Singleton类,同时调用GetInstance()方法,会可能造成同时创建多个实例的;
这时候需要给进程一把锁来处理;
lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则让它一直等待(即被阻止),直到该对象被释放;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 单例模式
{
class Singleton
{
private static Singleton _instance;
private static readonly object syncObject = new object();
//程序运行时创建一个静态只读的进程辅助对象;
//多线程时的单例
public static Singleton GetInstanceOfThread()
{
//lock时确保当一个线程位于代码的临界区时,另一个线程不进入临界区;
//如果其他线程试图进入锁定的代码,则将他一直等待(即被阻止),直到该对象被释放;
//在同一个时刻加了锁的这部分程序只有一个线程可以进入;
lock (syncObject)
{
if(_instance==null)
{
_instance = new Singleton();
}
}
return _instance;
}
}
}