读书人

请问一个关于lock的有关问题

发布时间: 2012-10-20 14:12:47 作者: rapoo

请教一个关于lock的问题
要毕业找工作了,所以找了一些笔试题来做,这里请教大家一个老生常谈的.Net面试题~O(∩_∩)O~

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

C# code
public void test(int i){    lock ([color=#FF0000]this[/color])    {        if (i > 10)        {            i--;            test(i);        }    }}

-----------------------------------------------------------
网上给出的答案一致:

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

对这个答案我百思不得其解,因为lock关键字获得的锁是this,是当前对象,线程递归调用代码段时,是共享同一个对象锁的,所以我认为是会发生死锁的。
我想上述满足答案的程序应该是这样:
C# code
public void test(int i){    lock ([color=#FF0000]i[/color])    {        if (i > 10)        {            i--;            test(i);        }    }}

也就是将this换成i,此时理论上确实不会发生死锁,因为i为值类型,所以每次线程递归调用时,都会产生一个i的副本,也就是产生一个新锁。
但事实上这样的代码在C#里通不过编译,lock要求的是引用类型。

不知道这样理解对不对,还请大家指教O(∩_∩)O~



[解决办法]
单线程的lock没多大意义。
更不能造成死锁。

造成死锁至少也要两个线程,分别锁两个对象才可能。

除非你手动上锁。

在你的代码中lock结束时手动再次把对象锁住 Monitor.Enter(this)

读书人网 >C#

热点推荐