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

本文关键字:线程 安全 编码 lock 语句 使用 | 更新日期: 2023-09-27 17:57:35

在使用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; }
}

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

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

从MSDN解释lock语句:

通常,避免锁定公共类型或超出代码的控制。常见构造lock(this)、lock(typeof(MyType))和锁("myLock")违反本指南:

  • 如果可以公开访问实例,那么锁定(这)就是一个问题。

  • 如果MyType是可公开访问的,那么锁(typeof(MyType))就是一个问题。

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

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