使用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
对象(即Obj
、LockObj
静态对象)或通过this
对象也可以获得相同的结果。请说清楚,哪个更好,为什么?
从MSDN解释lock
语句:
通常,避免锁定公共类型或超出代码的控制。常见构造lock(this)、lock(typeof(MyType))和锁("myLock")违反本指南:
如果可以公开访问实例,那么锁定(这)就是一个问题。
如果MyType是可公开访问的,那么锁(typeof(MyType))就是一个问题。
锁("myLock")是一个问题,因为进程中使用相同字符串的任何其他代码都将共享相同的锁。
最佳做法是定义一个要锁定的私有对象,或一个私有对象静态对象变量,以保护所有实例公用的数据。