【发布时间】:2011-06-26 02:44:02
【问题描述】:
为什么锁定非静态字段被认为是不好的做法?
而且,如果我不锁定非静态字段,那么如何在不锁定同一或派生类的所有其他实例的情况下锁定实例方法?
我写了一个例子来让我的问题更清楚。
public abstract class BaseClass
{
private readonly object NonStaticLockObject = new object();
private static readonly object StaticLockObject = new object();
protected void DoThreadSafeAction<T>(Action<T> action)
where T: BaseClass
{
var derived = this as T;
if(derived == null)
{
throw new Exception();
}
lock(NonStaticLockObject)
{
action(derived);
}
}
}
public class DerivedClass :BaseClass
{
private readonly Queue<object> _queue;
public void Enqueue(object obj)
{
DoThreadSafeAction<DerivedClass>(x=>x._queue.Enqueue(obj));
}
}
如果我对StaticLockObject 进行锁定,那么DoThreadSafeAction 方法将为派生自BaseClass 的所有类的所有实例锁定,这不是我想要的。我想确保当对象被锁定时,没有其他线程可以调用对象的特定实例上的方法。
更新
感谢大家的帮助:我已经发布了另一个问题,作为对你们提供的一些信息的跟进。由于您似乎精通这方面的知识,所以我发布了链接:What is wrong with this solution to locking and managing locked exceptions?
【问题讨论】:
-
谁说锁定实例字段是不好的做法?
标签: c# multithreading locking thread-safety deadlock