在C#中,为了使关键区域线程安全,我们可以使用lock()
语句。 lock语句接受一个对象。如果我们将this
传递给lock语句会出错?
答案 0 :(得分:6)
因为this
没有被类封装,因此很难说明谁锁定了这个。即为了找出代码的哪一部分锁定this
,你需要经历很多。另一方面,如果您将锁定限制为私有成员,则很容易推断锁定发生的位置。
答案 1 :(得分:6)
来自http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx:
一般情况下,避免锁定公众 类型或代码之外的实例 控制。常见构造
lock (this)
,lock (typeof (MyType))
和lock ("myLock")
违反此规定 准则:
lock (this)
如果有问题 实例可以公开访问。lock (typeof (MyType))
是一个问题,如果MyType
可公开访问。lock(“myLock”)
是一个问题,因为 使用过程中的任何其他代码 相同的字符串,将共享相同 锁。最佳做法是定义一个 要锁定的私有对象,或者 私有静态对象变量 保护所有实例共有的数据。