【发布时间】:2019-03-16 15:38:58
【问题描述】:
设计问题。我知道这种方法是线程安全的,但是从设计的角度来看,有没有更好的方法来做到这一点?
我有一个抽象类(不是线程安全的):
public abstract class Class1
{
protected someobject myobject;
public Class1()
{
myobject = new someoject();
}
public virtual void proc1()
{
// do something with my object
}
public virtual void proc2()
{
// do something with my object
}
public virtual void proc3()
{
// do something with my object
}
}
现在我想从这个类中创建一个需要线程安全的后代,所以我这样做了:
public class Class2: Class1
{
private static readonly object obj = new object();
public override void proc1()
{
lock(obj)
{
base.proc1();
}
}
public override void proc2()
{
lock(obj)
{
base.proc2();
}
}
public override void proc3()
{
lock(obj)
{
base.proc3();
}
}
}
我可以使基线程安全,但我有一些其他类继承自同一个基并且不需要线程安全,所以我不想强制线程安全。这种设计有什么问题吗?如果基地有很多公众成员,那就有点乏味了......
【问题讨论】:
-
通常这是通过封装而不是继承来完成的:referencesource.microsoft.com/#mscorlib/system/collections/… 你有相同数量的代码要编写,但至少你不必将所有基本方法都标记为虚拟
-
当然可以,但是它们之所以是虚拟的,是因为其他一些类可以修改基类的行为,所以它们需要保持虚拟。
-
如果 proc 只访问实例成员,我也会将锁对象设为实例对象,否则您将不必要地锁定不会相互干扰的调用。即,如果同时调用
a.proc1()和b.proc1()就可以了。
标签: c# inheritance thread-safety abstract-class