我在某个地方读过,虽然我记不起来,在C#中使用lock关键字可以分配。
我知道尝试锁定ValueType会包含值类型,但还有其他情况吗?
EDIT ::
答案 0 :(得分:1)
虽然内部看见同步块的分配是懒惰的(但这是我从Essential.NET'第1卷'中知道的IIRC的实现细节,或者它是通过C#进行CLR - 并且应该被视为只是那个),简单需要装箱的物品的情况与您建议的不相同 - 请参阅Why lock(<integer var>) is not allowed, but Monitor.Enter(<integer var>) allowed?
答案 1 :(得分:1)
如果您正在考虑使用:
锁(本)
你应该知道,因为你正在查看你的实例,你的用户 class也可以锁定它并搞砸你。不管是不是 问题取决于您认为您的用户可能会做什么。同样的情况 如果你正在做的话就存在:
锁(typeof运算(MyClass的))
如果您不想这样做,可以轻松分配静态或实例 object(即对象myLock = new object()),然后锁定它。
至于锁定引用类型与值类型,此SO question on Locking a resource when obtained...有答案:
这取决于类型 - 如果a 引用类型然后是,如果是值 型号。这也是你应该这样做的原因 从来没有,从那以后就锁定了一个值类型 值类型将被装箱和任何 后来试图锁定它 值实际上会获得锁定 一个不同的对象。
锁定语句的定义:
锁定声明(C#参考)
lock关键字标记一个语句 阻止作为一个关键部分 获得互斥锁 对于给定的对象,执行一个 声明,然后发布 锁。
这SO question on lock keyword in C#可能会有所帮助。您还可以查看Why lock() is not allowed, but Monitor.Enter() allowed?
编译器的规范定义了behavior of lock like so:
编译时的类型 锁定陈述的表达应 是参考类型还是&gt;类型 参数(§25.1.1)已知为a 参考类型。这是一个编译时 编译时类型的错误 表达式表示值类型。