单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。x
第一种:多线程安全,线程不是每次都加锁,按需加载(懒汉模式)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
public class Singleton
{
private static Singleton singleton;
/// <summary>
/// 程序运行时,创建一个静态只读的进程辅助对象
/// </summary>
private static readonly object obj = new object();
/// <summary>
/// 构造方法私有,外键不能通过New类实例化此类
/// </summary>
private Singleton()
{
Console.WriteLine("创建一个对象");
}
public void show()
{
Console.WriteLine("调用一下方法");
}
/// <summary>
/// 此方法是本类实例的唯一全局访问点
/// (双重加锁 Double-Check Locking)
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
if (singleton == null)//在同一时刻加了锁的那部分程序只有一个线程可以进入,实现线程安全
lock (obj)
{
//如实例不存在,则New一个新实例,否则返回已有实例
if (singleton == null)
{
singleton = new Singleton();
}
}
return singleton;
}
}
}
调用方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Test
{
static void Main(string[] args)
{
Task[] tasks=new Task[10];
for (int i = 0; i < 10; i++)
{
Task task = new Task(() =>
{
Singleton singleton = Singleton.GetInstance();
singleton.show();
});
tasks[i] = task;
}
Singleton singleton2 = Singleton.GetInstance();
singleton2.show();
for (int i = 0; i < tasks.Length; i++)
{
tasks[i].Start();
}
Console.ReadLine();
}
}
}
第二种:静态初始化,减少开销
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
public sealed class Singleton
{
private static readonly Singleton instance = null;
static Singleton()
{
instance = new Singleton();
}
private Singleton()
{
Console.WriteLine("创建一个对象");
}
public void show()
{
Console.WriteLine("调用一下方法");
}
public static Singleton GetInstance
{
get
{
return instance;
}
}
}
}