lock (obj3)
{
if (config == null)
{
logEvent("111111", threadNo);
config = DBConfigHelper.DBConfigCreateList;
}
}
private static object obj3 = new object();
开了多条线程去访问去访问这个语句,config被改了多次
以我的理解来看,不太可能。
出现这种情况,你先确义一下DBConfigHelper.DBConfigCreateList;返回的是不是本来就是null呢
还有,你确定你的obj3是static的?
public static List<DBConfig> config;
config是一个list集合,
DBConfigHelper.DBConfigCreateList是不可能为空的 而且为空也不影响
logEvent("111111", threadNo);是一个写日志的;
开多少条线程他写了多少条日志。证明全部线程都进来了
@User_Yong: 求完整代码
历史记录吧.
首先,lock (obj3),并不是让多线程只有一个能执行里面的代码,而是同一时刻只能有一个线程在执行Lock中的代码,其他线程排队等待,所以,有多少线程,lock中的代码就必然会执行多少次。
所以,你的这个问题的根本原因在于config在第一个线程执行完后到底还是不是null,如果还是null,那么第二个线程就还会进来,
第三,你的config变量是什么变量,是函数的局部变量还是类的一个字段?如果是局部变量的话那么不同的线程肯定都是Null。
//直接上代码 class Program { private static readonly Object obj = new Object(); static A a = null; static void Main(string[] args) { for (var i = 0; i < 100; i++) { Task.Factory.StartNew(Test); Console.WriteLine(i); } Console.ReadKey(); } static void Test() { if (a == null) { lock (obj) { if (a == null) { a = new A(); } } } } } class A { public A() { Console.WriteLine("--------------------------------------------------------------------A"); } }