当前位置: 代码迷 >> C# >> 想请教一个简单的线程有关问题
  详细解决方案

想请教一个简单的线程有关问题

热度:183   发布时间:2016-04-28 08:37:03.0
想请问一个简单的线程问题
class Program
    {
        public static int loopCount = 0;
        private object objLocker = new object();

        public class LoopTest
        {
            public void test(int i)
            {
                lock (this)
                {
                    if (i > 10)
                    {
                        i--;
                        loopCount++;
                        test(i);
                    }
                }
            }
        }

        static void Main(string[] args)
        {
            int intNum = 15;
            LoopTest loopTest = new LoopTest();
            loopTest.test(intNum);

            Console.WriteLine("result = " + loopCount);
            Console.ReadLine();

        }
    }


为什么这里在递归的时候没有出现死锁呢?其实是同事看到一条面试题问我的,为什么是object传递进去就会死锁,如下:

29.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。

public void test(int i)

{

   lock(this)

 {

   if (i>10)

   {

     i--;

     test(i);

   }

 }

}

答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
------解决思路----------------------
引用:
Quote: 引用:

这个例子不会死锁,因为第二次加锁的时候还在第一次加的锁的范围内,所以不会产生实际的效果


那为什么说如果传进去一个object就会产生死锁呢。。

传object也不会
------解决思路----------------------
你贴的那个“答案”实在是太坑爹了。

lock是针对2个以上线程的同步而言的。记住这一个基本概念,你就能发现29题再多的“解释”也无意义。
  相关解决方案