【发布时间】:2012-03-01 04:04:12
【问题描述】:
如果我有
abstract class Parent
{
static object staticLock = new object();
public void Method1()
{
lock(staticLock)
{
Method2();
}
}
protected abstract Method2();
}
class Child1 : Parent
{
protected override Method2()
{
// Do something ...
}
}
class Child2 : Parent
{
protected override Method2()
{
// Do something else ...
}
}
对new Child1().Method1() 和new Child2().Method1() 的调用会使用相同的锁吗?
【问题讨论】:
-
而staticLock是“私有的”(成员msdn.microsoft.com/en-us/library/ms173121.aspx的默认值),所以子类不能访问。
-
@AlexeiLevenkov 我只是想保证在任何时候都只调用一个
Method2,我不需要子类来访问它。 -
@JohnSaunders:我没有关注你。这里的想法是有一个 不可覆盖 的 public 方法,以确保 callers 总是获取锁。这样,派生类的作者就可以实现 Method2,而不必记住“哦,是的,我必须在这里锁定”。这种模式消除了一种错误,但当然也为另一种错误创造了机会;现在这些派生类的作者需要知道父类锁已被占用,并且不会导致死锁。
-
@AlexeiLevenkov:整个想法是防止派生类弄乱这个锁。不利的一面是,正如我在之前的评论中提到的,现在他们需要知道锁存在,以免导致死锁,即使他们无法访问锁。
-
有道理。是的,正如大家所说。建议:您应该以一种不会使它看起来像 Method1 的兄弟(即 MethodImpl)的方式命名您的 Method2。
标签: c# .net inheritance static locking