当前位置: 代码迷 >> ASP.NET >> 请问一个“死锁”有关问题
  详细解决方案

请问一个“死锁”有关问题

热度:3725   发布时间:2013-02-25 00:00:00.0
请教一个“死锁”问题
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 引用传递的话,每次修改的是对应的内存区域,就会无限等待下去 所以会发生死锁!
------解决方案--------------------------------------------------------
问题一:里面是个嵌套循环
问题二:锁对象
  相关解决方案