日期:2014-05-18  浏览次数:20426 次

请教一个“死锁”问题
C# code

using System;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.test(14);
        }
        public  void test(int i)
        {
            lock (this)
            {
                if (i > 10)
                {
                    i--;
                    Console.WriteLine(i);
                    test(i);//B处
                    Console.WriteLine(i);
                }
            }
        }//A处
    }
}


原来面试题:“当调用test方法时i>10时是否会引起死锁?”;答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)。

问题一:语句运行顺序问题,为什么在运行到i为10时,在"A处",又会跳到B处(这时i则会加1),运行Console.WriteLine;再到A处——B处Console.WriteLine。。。。。直到i为13才退出程序。为什么会这样运行?
问题二:为什么说“如果把int换做一个object,那么死锁会发生”?

------解决方案--------------------
问题一:就是因为lock的原因才会出现这种情况,因为程序第一次运行到B处的时候,调用Text()方法,因为被锁定,所以线程排队等待,之后程序继续执行,每次执行到B处都进行排队,当i<10的时候该方法执行完毕,线程队列中排队等待的开始执行所以就执行Text(10),text(11).....(因为是栈先进后出)
问题二:答案中说的已经比较清楚了 int 值传递改变的只是副本,而如果是object 引用传递的话,每次修改的是对应的内存区域,就会无限等待下去 所以会发生死锁!
------解决方案--------------------
问题一:里面是个嵌套循环
问题二:锁对象