版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aimin_com/article/details/80825198
引言:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
简介:为了保证我们只实例化一个对象,并且它可以提供一个访问该实例的方法,那我们就只能给上把锁。
/// <summary>
/// Singleton类,定义一个GetInstance操作,允许客户访问它的唯一实例。GetInstance是一个静态方法,主要负责创建自己的唯一实例。
/// </summary>
class Singleton
{
//定义一个静态变量来保存类的实例
private static Singleton instance;
//定义私有构造函数,使外界不能创建该类实例
private Singleton()
{
}
//定义公有方法提供一个全局访问点
public static Singleton GetInstance()
{
//如果实例不在,则new一个新的实例,否则返回已有的实例
if (instance ==null )
{
instance = new Singleton();
}
return instance;
}
}
多线程时的单例:
class singletion
{
private static singletion instance; //定义一个标识确保线程同步
private static readonly object syncRoot = new object();//当程序运行时创建一个静态只读的进程辅助对象
private singletion()//定义私有构造函数,使外界不能创建该实例。
{
}
public static singletion GetInstance()
{
//当第一个线程运行到这里时,此时会对syncRoot对象“枷锁”
lock (syncRoot )
{
//如果实例不存在时则创建,否则直接返回
if (instance==null )
{
instance = new singletion();
}
}//lock语句运行完后(既线程运行完后)会对该对象解锁
return instance;
}
}
为了我们不影响性能–双重锁定
//我们在GetInstance中重中添加一个if语句。
if (instance ==null)
{
lock (syncRoot )
{
if (instance ==null )
{
instance = new singletion();
}
}
}
客户端代码
//客户端代码
static void Main(string[] args)
{
Singleton s1=Singleton.GetInstance ();
Singleton s2 = Singleton.GetInstance();
if (s1==s2 )
{
Console.WriteLine("两个对象是相同的实例");
}
Console.Read();
}
lock:确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),知道该对象被释放。