C# 单例模式之双检锁
何为单例模式!就是全局只new对象一次!然后把对象保存起来!如果下次要用!就不许要new了!节省多次new对象的的时间!而且也剩下很多内存!
但是!单例模式
//单线程写法,多线程有问题,多线程会new多次
public class SqlServerProxy:IDbContext { public static SqlServerProxy _SqlServerProxy=null; public static SqlServerProxy CreateSqlServersProxy() { if (_SqlServerProxy==null) { _SqlServerProxy = new SqlServerProxy(); } return _SqlServerProxy; } }
假如你这样写单例模式!那么会出问题!在单线程中!这样写是没有问题的!一旦开启多线程访问!由于多个线程同时访问对象的单例模式!就会出现A线程还在进行判断,B线程也进来了!所以会导致线程被创建两次!这就没有了单例模式的意义了!
所以!我们要给单例加一把锁!让A线程访问进来的时候!B线程在外面等待A线程访问结束!然后再进入构造函数,这样就能很好的避免对象被创建两次的事情
//这是多线程写法!保证了A线程访问时!B线程在外等待A线程结束!为什么又包了一个_SqlServerProxy是否为空的判断呢!是因为当第一次创建完实例之后!多线程第二次访问进来之后!就不用让多线程等待了!
//直接判断是否为空!就返回对象! 这样的写法!叫做!双检锁
public class SqlServerProxy:IDbContext { public static SqlServerProxy _SqlServerProxy=null; public static readonly object SqlServerProxy_Loke = new object(); public static SqlServerProxy CreateSqlServersProxy() { lock (SqlServerProxy_Loke) { if (_SqlServerProxy == null) { _SqlServerProxy = new SqlServerProxy(); } } return _SqlServerProxy; } }