使用lock语句进行线程安全编码

时间:2014-04-09 06:19:31

标签: c# multithreading thread-safety locking

我在使用lock statement使线程安全时遇到一些疑问,这是我的代码:

public class Class1
{
    public ClassName _Obj;
    private static object LockObj = new object();

    public ClassName Obj
    {
        get { return _Obj ?? (_Obj = new ClassName()); }
    }

    public void ThreadA()
    {
        //lock (LockObj) --able to handle the thread
        //lock (Obj) --it is also able to handle the thread
        lock (this) // --same for this also
        {
            for (int i = 0; i < 1000; i++)
            {
                Obj.ValueA = i;
                // Processing on Obj..
            }
        }
    }
}

public class ClassName
{
    public int ValueA { get; set; }
}

在此代码块ThreadA中,可以使用lock语句使其安全。但是将参数传递给lock语句的确切方法是什么?通过传递ClassName对象即ObjLockObj对象(静态或this对象)也可以实现相同的结果。请说清楚,哪个更好,为什么?

1 个答案:

答案 0 :(得分:2)

MSDN解释lock声明:

  

一般情况下,避免锁定公共类型或超出您的实例   代码的控制。常见的构造锁定(this),锁定(typeof   (MyType))和lock(&#34; myLock&#34;)违反了这条准则:

     
      如果可以公开访问实例,则
  • lock(this)是一个问题。

  •   如果MyType可公开访问,则
  • lock(typeof(MyType))是一个问题。

  •   
  • lock(&#34; myLock&#34;)是一个问题,因为使用相同字符串的进程中的任何其他代码都将共享相同的锁。

  •   
     

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