首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

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

2012-04-19 
请教一个“死锁”问题C# codeusing Systemusing System.Textnamespace ConsoleApplication2{class Program

请教一个“死锁”问题

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 引用传递的话,每次修改的是对应的内存区域,就会无限等待下去 所以会发生死锁!
[解决办法]
问题一:里面是个嵌套循环
问题二:锁对象

热点排行