#region 数据库层单例模式 private static IDB _EFDB = null; // Creates an syn object. private static readonly object SynObject = new object(); public static IDB InstanceEFDB { get { // Double-Checked Locking if (null == _EFDB) { lock (SynObject) { if (null == _EFDB) { _EFDB = new EFDB(); } } } return _EFDB; } } #endregion //数据库层单例模式
为什么lock()后面还要判断一次 null == _EFDB,由于lock加锁,两个线程则一个进入,另一个在排队等待,必须要其中一个进入并出来后,另一个才能进入,因此如果没有第二次 null == _EFDB 为空的判断,则第一个线程创建了实例,第二个还是可以继续再创建新的实例