我在某个地方读过,虽然我记不起来,在C#中使用lock关键字可以分配。

我知道尝试锁定ValueType会包含值类型,但还有其他情况吗?

EDIT ::

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

解决方案

虽然内部看见同步块的分配是懒惰的(但这是我从Essential.NET'第1卷'中知道的IIRC的实现细节,或者是通过C#进行CLR - 并且应该被视为只是那样),简单需要装箱的物品的情况,就像你建议不会出现一样 - 参见为什么不允许锁定(<!> lt; integer var <!> gt;),但允许使用Monitor.Enter(<!> lt; integer var <!> gt;)? / A>

其他提示

如果您正在考虑使用:

锁(本)

你应该知道,因为你正在查看你的实例,你的用户 class也可以锁定它并搞砸你。不管是不是 问题取决于您认为您的用户可能会做什么。同样的情况 如果你正在做的话就存在:

锁(typeof运算(MyClass的))

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

来源

至于锁定引用类型与值类型,此获得资源时锁定资源的问题...... 有答案:

  

这取决于类型 - 如果a   引用类型然后是,如果是值   型号。这也是你应该这样做的原因   从来没有,从那以后就锁定了一个值类型   值类型将被装箱和任何   后来试图锁定它   值实际上会获得锁定   一个不同的对象。

锁定语句的定义:

  

锁定声明(C#参考)

     

lock关键字标记一个语句   阻止作为一个关键部分   获得互斥锁   对于给定的对象,执行一个   声明,然后发布   锁。

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

编译器的规范定义了行为如此锁定

  

编译时的类型   锁定陈述的表达应   是参考类型还是<!> gt;类型   参数(<!>#167; 25.1.1)已知为a   参考类型。这是一个编译时   编译时类型的错误   表达式表示值类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top