如果您正在考虑使用:
锁(这个)
您应该知道,因为您正在查看您的实例,您班级的用户也可能会锁定它并搞砸您。这是否是一个问题取决于您认为您的用户可能会做什么。如果您正在执行以下操作,则存在相同的情况:
锁(类型(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 节)。表达式的编译时类型表示值类型是编译时错误。