单例模式分为2种:
一种是饿汉模式:自己主动实例化。
public sealed class 单例
{
private 单例()
{
}
static readonly 单例 instance = new 单例();
public static 单例 Instance
{
get
{
return instance;
}
}
}
通常这种方式readonly跟static一起使用,它的初始化交由静态字段实现,并可以在运行时编译。(静态变量直接在后面赋值,编译成IL之后是在和在静态构造函数里面实例化是一样的.因此也可以写到stati 单例(){}里) 这种模式我们无需自己解决线程安全性问题。CLR会给我们解决。
二种是懒汉模式:
使用了双重锁方式较好地解决了多线程下的单例模式实现。先看内层的if语句块,使用这个语句块时,先进行加锁操作,保证只有一个线程可以访问该语句块,进而保证只创建了一个实例。再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回该实例,节省了性能开销。
public class 单例1 { static 单例1 instance; static object objhelp = new object(); public static 单例1 Instance { get { if (instance == null) { lock (objhelp) { if(instance==null) instance = new 单例1(); } } return instance; } } }