单例模式
问题场景
想要在内存中只创建一个全局唯一的对象,该类型只能new一次。可以将对象作为静态字段或属性存取,在静态构造函数中初始化这个属性为对象,也可以在某个方法中做一个判定,如果该字段或属性已经被初始化则直接返回它,否则new一个即可,但是在多线程竞争资源的情况下,可能会导致静态构造函数或某个方法被调用两次,导致内存中出现两个该类型的对象。
总结模式
利用线程锁加双重判定可以实现完美的单例模式。
示例代码
public class Single
{
private static readonly object lockObj = new object( );
private static Single single;
public static Single GetSingle( )
{
if (single != null) return single;//线程锁容易耗费时间,所以此处预先做一个判定,避免在single已经创建完成之后其它线程去请求锁
lock (lockObj)
{
if (single != null) return single; //防止当A线程即将创建实例之前,B线程刚好执行完第一个判定,B就要申请锁,A创建完实例之后,B就会进入锁区继续创建实例
single = new Single( );
return single;
}
}
}
{
private static readonly object lockObj = new object( );
private static Single single;
public static Single GetSingle( )
{
if (single != null) return single;//线程锁容易耗费时间,所以此处预先做一个判定,避免在single已经创建完成之后其它线程去请求锁
lock (lockObj)
{
if (single != null) return single; //防止当A线程即将创建实例之前,B线程刚好执行完第一个判定,B就要申请锁,A创建完实例之后,B就会进入锁区继续创建实例
single = new Single( );
return single;
}
}
}