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,那么死锁会发生)
------解决思路----------------------
传object也不会
------解决思路----------------------
你贴的那个“答案”实在是太坑爹了。
lock是针对2个以上线程的同步而言的。记住这一个基本概念,你就能发现29题再多的“解释”也无意义。