1

我在某处读到,虽然我不记得在哪里,但在 C# 中使用 lock 关键字可以分配。

我知道尝试锁定 ValueType 会使 valuetype 装箱,但还有其他情况吗?

编辑::

  1. 每个人似乎都在回答 valuetype 案例,我已经知道了!
  2. 我也知道什么是锁以及如何深入使用它们,关于最佳实践的一般建议很好 - 但没用;)
  3. 我需要知道,因为我正在构建一个 XNA 应用程序以在 xbox 上进行部署。xbox 垃圾收集器真的很慢 - 这意味着我需要将分配保持在最低限度,最好是不存在(这会阻止收集器运行)
4

2 回答 2

1

虽然内部分配查看同步块是惰性的(但这是我从 Essential.NET '第 1 卷'中知道的 IIRC 的实现细节,或者它是通过 C# 的 CLR - 应该被视为那样),简单的情况下需要像您建议的那样装箱的项目不会出现 - 请参阅为什么不允许 lock(<integer var>),但允许 Monitor.Enter(<integer var>)?

于 2009-11-30T14:44:28.573 回答
1

如果您正在考虑使用:

锁(这个)

您应该知道,因为您正在查看您的实例,您班级的用户也可能会锁定它并搞砸您。这是否是一个问题取决于您认为您的用户可能会做什么。如果您正在执行以下操作,则存在相同的情况:

锁(类型(MyClass))

如果您不想这样做,您可以轻松地分配一个静态或实例对象(即 object myLock = new object()),然后对其进行锁定。

来源

至于锁定引用类型与值类型,关于 Locking a resource when getting...这个SO question有答案:

这取决于类型 - 如果是引用类型,那么是,如果是值类型,则否。这也是为什么您永远不应该锁定值类型的原因,因为该值类型将被装箱,并且任何后续锁定该值的尝试实际上都会获得另一个对象的锁定。

lock语句的定义:

lock 语句(C# 参考)

lock 关键字通过获取给定对象的互斥锁、执行语句然后释放锁来将语句块标记为临界区。

这个关于 C# 中 lock 关键字的 SO question可能会有所帮助。您还可以查看为什么不允许 lock(),但允许 Monitor.Enter()?

编译器的规范定义了锁的行为,如下所示

lock 语句表达式的编译时类型应为引用类型或已知为引用类型的 > 类型参数(第 25.1.1 节)。表达式的编译时类型表示值类型是编译时错误。

于 2009-11-30T14:45:52.513 回答