C#

单例模式

问题场景

想要在内存中只创建一个全局唯一的对象,该类型只能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;
        }
    }
}

 

C# - 设计模式目录

原文地址:https://www.cnblogs.com/myrocknroll/p/8596879.html