。。
为什么锁定的是一个object对象的lockHelper而不是IDataProvider对象_instance呢?Discuz.Data
DataProvider.cs
namespace Discuz.Data
{
public class DatabaseProvider
{
private DatabaseProvider()
{ } private static IDataProvider _instance = null;
private static object lockHelper = new object(); static DatabaseProvider()
{
GetProvider();
} private static void GetProvider()
{
try
{
_instance = (IDataProvider)Activator.CreateInstance(Type.GetType(string.Format("Discuz.Data.{0}.DataProvider, Discuz.Data.{0}", BaseConfigs.GetDbType), false, true));
}
catch
{
throw new Exception("请检查DNT.config中Dbtype节点数据库类型是否正确,例如:SqlServer、Access、MySql");
}
} public static IDataProvider GetInstance()
{
if (_instance == null)
{
lock (lockHelper)
{
if (_instance == null)
{
GetProvider();
}
}
}
return _instance;
}        public static void ResetDbProvider()
        {
            _instance = null; 
        }
}
}

解决方案 »

  1.   

    应该是笔误吧,锁lockHelper 没有意义!
      

  2.   

    GetProvider需要对文件访问,所以要锁一下。
      

  3.   

    为什么是锁那无关的对象而不是实际的_instance呢?!
      

  4.   

    _instance是静态变量 需要锁吗? 只要赋值了 下次谁再来访问都不是null啊 ~~
      

  5.   

    _instance 不是为 null嘛,lock(null)是无法使用的。许多人觉得此地写 lock(typeof(DatabaseProvider)){} 或许更清楚。不过当_instance为类内private的,好处是可以避免类外的代码“滥锁”它从而造成较多的锁冲突。
      

  6.   

    _instance为null无法锁不为null的话锁了以后其他地方无法使用一般都是定义一个lock实现锁定另外lock(typeof(DatabaseProvider))这种锁定方法很霸道,所有用到DatabaseProvider的地方都会暂时被锁定
      

  7.   

    找到答案了,原来这叫双重锁定,保证线程完全。谢谢各位关注。整个代码我都是COPY上来的,没有改,只是顶部的namespace不必要的CUT掉了。