我在使用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
对象即Obj
,LockObj
对象(静态或this
对象)也可以实现相同的结果。请说清楚,哪个更好,为什么?
答案 0 :(得分:2)
从MSDN解释lock
声明:
一般情况下,避免锁定公共类型或超出您的实例 代码的控制。常见的构造锁定(this),锁定(typeof (MyType))和lock(&#34; myLock&#34;)违反了这条准则:
如果可以公开访问实例,则
- 如果MyType可公开访问,则
lock(this)是一个问题。
lock(typeof(MyType))是一个问题。
lock(&#34; myLock&#34;)是一个问题,因为使用相同字符串的进程中的任何其他代码都将共享相同的锁。
最佳做法是定义要锁定的私有对象或私有对象 静态对象变量,用于保护所有实例共有的数据。