静态锁是否适用于不同的子类
本文关键字:子类 适用于 是否 静态 | 更新日期: 2023-09-27 18:23:52
如果我有
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()
的调用会使用相同的锁吗?
是。派生类不会从基类获得静态数据的新副本。
但是,泛型类的情况并非如此。如果你说:
class Base<T>
{
protected static object sync = new object();
...
}
class Derived1 : Base<int> { ... }
class Derived2 : Base<int> { ... }
class Derived3 : Base<string> { ... }
class Derived4 : Base<string> { ... }
class Derived5 : Base<object> { ... }
class Derived6 : Base<object> { ... }
Derived1和Derived2的实例具有相同的同步对象。Derived3和Derived4的实例具有相同的同步对象。Derived5和Derived6的实例具有相同的同步对象。但是这三个同步对象都是不同的对象。
是的,一般来说,static
对象上的lock
保护类的所有实例的数据。
来自MSDN:
最佳做法是定义要锁定的私有对象,或私有对象静态对象变量,用于保护所有实例公用的数据。
要添加到ken2k的答案中:[是]。。。除非它被标记为CCD_ 5(这里显然不是这样)。