论坛上有人发过个贴子:
6、根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。(10分)
public void test(int i)
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生) 说int换成object有死锁,但是我如下代码:    public void test(object i)
    {
        lock (this)
        {
            if ( Convert.ToInt32( i) > 10)
            {
                i =  Convert.ToInt32(i)-1;
                test(i);
            }
        }
    }
没有发生死锁阿,请教下为什么发生死锁,怎样发生???

解决方案 »

  1.   

    概念我当然知道,就是在lock中一直运行程序出不来了,但是上面的代码int换成objcet就是没有所说的那样发生死锁现象,这是为什么?
      

  2.   

    public void test(int i) 

    lock(this) 

    if (i>10) 

    --i; 
    test(i); 


    } 这样就会死锁了.
      

  3.   

    int 换成object凭什么就要发生死锁?
      

  4.   

    别人说的...那是他说错了哦....www.jobhere.net/mianshi/bishi/2300.shtml
      

  5.   

    两个线程相互等待对方释放自己想要的资源才会发生死锁,你这个顶多叫界面没有相应(i>100000...)
    比如下面2个线程就死锁了namespace WindowsApplication18
    {
        public partial class Form1 : Form
        {
            int x = 0, y = 0;
            Object X = new Object(), Y = new Object();
            public Form1()
            {
                InitializeComponent();
            }        delegate void ShowText(String Text);        void DoShowText(String Text)
            {
                this.Text = Text;
            }        void A()
            {
                ShowText PDoShowText = new ShowText(DoShowText);
                while (true)
                    lock (X)
                    {
                        lock (Y)
                        {
                            y++;
                            this.Invoke(PDoShowText, new Object[] { "X:" + x.ToString() + " Y:" + y.ToString() });
                        }
                    }
            }        void B()
            {
                ShowText PDoShowText = new ShowText(DoShowText);
                while (true)
                    lock (Y)
                    {
                        lock (X)
                        {
                            x++;
                            this.Invoke(PDoShowText, new Object[] { "X:" + x.ToString() + " Y:" + y.ToString() });
                        }
                    }
            }        private void Form1_Shown(object sender, EventArgs e)
            {
                // 每次X或Y(每次执行先后都不一样)加一后会立即发生死锁,X或Y不会继续增加
                  new System.Threading.Thread(new System.Threading.ThreadStart(A)).Start();
                new System.Threading.Thread(new System.Threading.ThreadStart(B)).Start();
            }
        }
    }
      

  6.   

    如果你在各个lock上设置调试断点,更是连+1都不会了
      

  7.   

    标准答案是
    不会死锁,因为lock锁定的是不同线程间的操作,而递归调用属于同线程的调用。
      

  8.   

    不会锁死。
    1、此函数是递归调用,不会形成死循环的现象,因此最终都可以unlock(this)
    2、lock一个对象是对线程范围内来考虑,同一线程内只有死循环,但不会死锁。死锁只有在不同线程中同时调用被lock的对象,只有此时在线程争夺对象时才会出现死锁现象。