静态锁是否适用于不同的子类?

时间:2012-02-08 17:08:21

标签: c# .net inheritance static locking

如果我有

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()的来电是否会使用相同的锁?

3 个答案:

答案 0 :(得分:16)

是。派生类不会从基类获取静态数据的 new 副本。

但是,泛型类不是这种情况。如果你说:

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的实例具有相同的同步对象。但是这三个同步对象都是不同的对象。

答案 1 :(得分:2)

是的,一般来说,lock对象上的static会保护您班级所有实例的数据。

来自MSDN

  

最佳做法是定义要锁定的私有对象,或私有   静态对象变量,用于保护所有实例共有的数据

答案 2 :(得分:2)

要添加到ken2k的答案:[是] ......除非它被标记为[ThreadStatic](这显然不是这里的情况)。