本帖最后由 walilk 于 2012-10-07 17:41:49 编辑

解决方案 »

  1.   

    这种白痴问题如果你看下MSDN,都可以找到答案:
    http://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:
     
    如果实例可以被公共访问,将出现 lock (this) 问题。
    ...
    最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。 简单来说,当外部程序试图lock你的对象实例,并且在块内调用你的这个方法的时候,就会死锁。这个最基本的常识如果都不知道,还是回学校重新学吧。
      

  2.   

    本帖最后由 caozhy 于 2012-10-07 18:02:30 编辑
      

  3.   

    @caozhy我看了那篇文章,很受教,只是我还是不太明白单线程递归调用某个函数时的死锁情况,我做了测试也无法制造死锁,代码如下:
    private Object thisLock = new Object();
    private void test(int i)
    {
        lock (thisLock)
        {
            if (i > 10)
            {
                Console.WriteLine("i:" + i.ToString());
                i--;
                test(i);
            }
        }
    }
    ----------------
    private void test(int i)
    {
        lock (this)
        {
            if (i > 10)
            {
                Console.WriteLine("i:" + i.ToString());
                i--;
                test(i);
            }
        }
    }这两段代码都没法产生死锁,请问caozhy能给我一段可以产生死锁的代码么,要递归调用的
      

  4.   

    @caozhy
    这位兄台,你测试那段代码了吗??我在开发环境里做了下测试,依然没有死锁产生,事实上a.foo();执行了
      

  5.   

    单线程的lock没多大意义。
    更不能造成死锁。造成死锁至少也要两个线程,分别锁两个对象才可能。除非你手动上锁。在你的代码中lock结束时手动再次把对象锁住 Monitor.Enter(this)
      

  6.   

    @haukwong你说的对,确实,我测试了程序,单线程无法lock。
    想想也是,单线程访问资源,就么必要给资源加锁了