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

C# 在.Net中锁定-引用被锁定还是对象被锁定?,c#,.net,multithreading,locking,C#,.net,Multithreading,Locking,假设我有以下代码: object o1 = new Object(); object o2 = o1; 锁定o1是否与锁定o2相同?(如果o1被锁定,锁定的o2是否会阻塞,直到o1被释放?) 在o1上获得锁定是否与在o2上获得锁定相同 对 它与称为a的东西一起工作,a是每个对象实例的一部分。但在功能上,您可以将其视为使用对象作为字典中的键 锁定引用将与相同,但存在相同的问题 是,.NET锁定引用(锁定值类型将导致错误)是,因为锁定对象,而不是对象引用o2=o1复制引用,而不是对象。如果它锁定了

假设我有以下代码:

object o1 = new Object();
object o2 = o1;
锁定o1是否与锁定o2相同?(如果o1被锁定,锁定的o2是否会阻塞,直到o1被释放?)

o1
上获得锁定是否与在
o2
上获得锁定相同

它与称为a的东西一起工作,a是每个对象实例的一部分。但在功能上,您可以将其视为使用对象作为字典中的键


锁定引用将与相同,但存在相同的问题

是,.NET锁定引用(锁定值类型将导致错误)

是,因为锁定对象,而不是对象引用
o2=o1
复制引用,而不是对象。

如果它锁定了引用本身,那么锁定将毫无用处。问题是,引用本身是按值复制的,所以您总是锁定一些立即丢弃的临时副本


所以这不是它的工作原理。锁是在引用引用的实例上获得的,而不是引用本身。

如果值类型已装箱,则确实可以锁定它。锁定计算结果为值类型的表达式是一个编译时错误。这样放置很明显。