首页 新闻 会员 周边 捐助

lock锁代码时其他线程可以访问

0
悬赏园豆:50 [已关闭问题] 关闭于 2014-07-24 11:35

lock (obj3)
{
  if (config == null)
  {
    logEvent("111111", threadNo);
    config = DBConfigHelper.DBConfigCreateList;
   }
}

private static object obj3 = new object();

开了多条线程去访问去访问这个语句,config被改了多次

User_Yong的主页 User_Yong | 初学一级 | 园豆:137
提问于:2014-06-27 17:18
< >
分享
所有回答(5)
0

以我的理解来看,不太可能。

出现这种情况,你先确义一下DBConfigHelper.DBConfigCreateList;返回的是不是本来就是null呢

还有,你确定你的obj3是static的?

angelshelter | 园豆:9914 (大侠五级) | 2014-06-27 17:35

public static List<DBConfig> config;

config是一个list集合,

DBConfigHelper.DBConfigCreateList是不可能为空的 而且为空也不影响

logEvent("111111", threadNo);是一个写日志的;

开多少条线程他写了多少条日志。证明全部线程都进来了

支持(0) 反对(0) User_Yong | 园豆:137 (初学一级) | 2014-06-27 17:41

@User_Yong: 求完整代码

支持(0) 反对(0) angelshelter | 园豆:9914 (大侠五级) | 2014-06-27 17:43
0

历史记录吧.

[秦时明月] | 园豆:738 (小虾三级) | 2014-06-27 17:37
1

首先,lock (obj3),并不是让多线程只有一个能执行里面的代码,而是同一时刻只能有一个线程在执行Lock中的代码,其他线程排队等待,所以,有多少线程,lock中的代码就必然会执行多少次。

所以,你的这个问题的根本原因在于config在第一个线程执行完后到底还是不是null,如果还是null,那么第二个线程就还会进来,

第三,你的config变量是什么变量,是函数的局部变量还是类的一个字段?如果是局部变量的话那么不同的线程肯定都是Null。

hailants | 园豆:750 (小虾三级) | 2014-06-28 22:09
0
wongdavid | 园豆:394 (菜鸟二级) | 2014-06-29 15:25
0
//直接上代码
    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");
        }
    }

 

写代码的小2B | 园豆:4377 (老鸟四级) | 2014-06-29 22:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册