在 .Net 中锁定 - 是引用被锁定还是对象被锁定?

9

假设我有以下代码:

object o1 = new Object();
object o2 = o1;

在IT技术中,获得o1的锁与获得o2的锁是否相同?(如果o1已被锁定,那么锁定o2会阻塞直到o1被释放吗?)

4个回答

12
如果它锁定了引用本身,那么锁定将是无用的。问题在于,引用本身是按值复制的,因此您始终会锁定一些立即被丢弃的临时副本。因此,它的工作方式并非如此。锁定是在引用所引用的实例上获得的,而不是引用本身。

这样说的话很明显。 - ytoledano

7
获得对o1的锁定与获得对o2的锁定是一样的吗?是的。它使用每个对象实例的名为同步块的东西来工作。但在功能上,您可以将其视为在字典中使用对象作为键。锁定引用就像锁定值类型一样,存在相同的问题。

2
是的,因为锁是在对象上取得的,而不是在对象引用上。 o2 = o1 只是复制了引用,而不是对象本身。

-1

是的,.NET锁定引用(在值类型上锁定会导致错误)


如果一个值类型被装箱了,确实可以对其进行锁定。但是,如果锁定的是一个求值结果为值类型的表达式,则会在编译时出现错误。 - Mike Zboray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接