【发布时间】:2009-01-30 17:22:14
【问题描述】:
假设我有以下代码:
public class SomeClass()
{
private readonly object _lock = new object();
public void SomeMethodA()
{
lock (_lock)
{
SomeHelperMethod();
//do something that requires lock on _lock
}
}
public void SomeMethodB()
{
lock (_lock)
{
SomeHelperMethod();
//do something that requires lock on _lock
}
}
private void SomeHelperMethod()
{
lock (_lock)
{
//do something that requires lock on _lock
}
}
}
锁定SomeHelperMethod 内部似乎是多余和浪费的,因为所有调用者都已经获得了锁定。但是,简单地从SomeHelperMethod 中移除锁似乎很危险,因为我们可能稍后会重构代码并忘记在调用SomeHelperMethod 之前锁定_lock 对象。
理想情况下,我可以通过断言当前线程在SomeHelperMethod 内拥有_lock 上的锁来解决此问题:
private void SomeHelperMethod()
{
Debug.Assert(Monitor.HasLock(_lock));
//do something that requires lock on _lock
}
但似乎没有这样的方法。 Monitor.TryEnter 没有有帮助,因为锁是可重入的。因此,如果当前线程已经拥有锁,TryEnter 仍然会成功并返回true。唯一会失败的情况是另一个线程拥有锁并且调用超时。
那么,这样的方法存在吗?如果不是,为什么?这对我来说似乎一点也不危险,因为它只是告诉你当前线程(而不是另一个线程)是否拥有锁。
【问题讨论】:
标签: .net multithreading locking