首页 新闻 会员 周边

关于死锁 的问题。一个面试题。

0
[待解决问题]
public void test(int i) 
{
lock(this)
{
if (i>10)
{
i--;
test(i);
}
}
}

哪位高手能帮忙详细解释下。。为什么 吧 i换成object后换发生死锁。

yzy的主页 yzy | 菜鸟二级 | 园豆:317
提问于:2012-03-07 00:58
< >
分享
所有回答(3)
0

因为i开始是int类型,也就是值类型,所以不会发生死锁,换成object后就是引用类型了。它的值会不但的改变。

悟行 | 园豆:12559 (专家六级) | 2012-03-07 09:38

我希望从原理上面进行解释下。这样太抽象。。。网上 的答案都是这样。  我想问 的是 为什么int 值类型的不会发生死锁。 有人说因为只类型每次使用个的是副本。 副本是怎么回事。运行原理是怎么样 的。。等等。

支持(0) 反对(0) yzy | 园豆:317 (菜鸟二级) | 2012-03-07 10:00

@yzy: 看完这个你就知道了:http://blog.csdn.net/begtostudy/article/details/2816320

支持(0) 反对(0) 悟行 | 园豆:12559 (专家六级) | 2012-03-07 11:18
0

相当于你内存里有一块数据,会有一个地址代表这个数据块,比如你的D盘中有一个xx.txt文件,(object)引用类型相当于你在桌面创建了一个快捷方式,而值类型相当于你在桌面新建了一个一样的文件一样。

毛小乐 | 园豆:200 (初学一级) | 2012-03-07 10:40
0

不是死锁,是死循环了。如果把i改成object,代码差不多是:

public void Test(object i){

     int n = (int)i;//这段代码创建了一个变量n,然后把i的值赋给n,存到栈中。而i的实际对象是存在堆中的,所以n和i指向的不是同一个对象.

lock(this){

n--;//因为n和i不是同一个对象,因此n的改变不能引起i的改变

test(i);//因为i没有改变,所以i还是10,所以会变成死循环

}

}

joseph chong | 园豆:224 (菜鸟二级) | 2012-03-07 12:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册