关于lock死锁的问题

IE11下面经常卡到爆 2010-10-10 10:22:04

void test(int i)
{
lock (this)
{
if (i > 10)
{
i--;
test(i);
}
}
}


面试题:当i>10时,是否会发生死锁,为什么?
假定test(15)
单步发现 当i--到10时,执行完了lock块以后,程序又会跳回去执行迭代的test(i),这时候i又会自加,直到14后,完成整个调用。
不太明白为什么会这样,lock应该只能锁引用类型,不能锁值类型的,否则会发生死锁,是这样吗?
(最好的做法是声明一个private的实例,然后锁它,这个我知道)

...全文
248 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-10-10
  • 打赏
  • 举报
回复
应该是只想描述说递归后逐级返回的意思。一种绕口的说法而已。
  • 打赏
  • 举报
回复
谢谢两位
lock关键看锁的是什么对象,this即当前对象的实例,如果有并发线程,则在另外一个线程中无法访问该实例(直到解锁),或者重新声明一个新实例,所以一般都应该锁一个private的实例,这样可以避开不应该出现的死锁

假定test(15)
单步发现 当i--到10时,执行完了lock块以后,程序又会跳回去执行迭代的test(i),这时候i又会自加,直到14后。。。
还是不太明白为什么lock块执行完后,迭代的test(i)会自加,直到14后完成整个调用..
phil999 2010-10-10
  • 打赏
  • 举报
回复
这个例子里不会死锁,lock语句实际上是调用 Monitor 的 Enter 和 Exit,同一线程在不阻止的情况下多次调用 Enter 是合法的,如果锁定值类型,那么这个值会装箱。我想楼主的函数只是实验性质的。
wuyq11 2010-10-10
  • 打赏
  • 举报
回复
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。
http://topic.csdn.net/u/20100707/21/4397f902-a578-4ad6-a28c-523dd07a32ad.html
swalp 2010-10-10
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx
刚在msdn上看的。对于lock我没用过。感觉挺有意思的。
young5335 2010-10-10
  • 打赏
  • 举报
回复
对test(15)的调用中,内部的递归test(xx)与test(15)内的i几乎没有关系.所以最后递归返回时i仍然是14.也就是说,当i为15时,执行了一下i--后,下面的test(14)以及test(14)内部的i与test(15)时的i根本没有直接关系

另外,值类型lock时,能通过编译吗?VS2010ENU版的通不过编译

110,552

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧