我们为什么要避免锁(这个)?

时间:2010-09-17 17:53:00

标签: c# multithreading

  

可能重复:
  Why is lock(this) {…} bad?

在C#中,为了使关键区域线程安全,我们可以使用lock()语句。 lock语句接受一个对象。如果我们将this传递给lock语句会出错?

2 个答案:

答案 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”)是一个问题,因为   使用过程中的任何其他代码   相同的字符串,将共享相同   锁。
  •   
     

最佳做法是定义一个   要锁定的私有对象,或者   私有静态对象变量   保护所有实例共有的数据。