因为i开始是int类型,也就是值类型,所以不会发生死锁,换成object后就是引用类型了。它的值会不但的改变。
我希望从原理上面进行解释下。这样太抽象。。。网上 的答案都是这样。 我想问 的是 为什么int 值类型的不会发生死锁。 有人说因为只类型每次使用个的是副本。 副本是怎么回事。运行原理是怎么样 的。。等等。
@yzy: 看完这个你就知道了:http://blog.csdn.net/begtostudy/article/details/2816320
相当于你内存里有一块数据,会有一个地址代表这个数据块,比如你的D盘中有一个xx.txt文件,(object)引用类型相当于你在桌面创建了一个快捷方式,而值类型相当于你在桌面新建了一个一样的文件一样。
不是死锁,是死循环了。如果把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,所以会变成死循环
}
}