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

Jad*_*ias 7 .net c# 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 ...
    }
}
Run Code Online (Sandbox Code Playgroud)

会调用new Child1().Method1()new Child2().Method1()使用相同的锁吗?

Eri*_*ert 16

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

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

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> { ... }
Run Code Online (Sandbox Code Playgroud)

Derived1和Derived2的实例具有相同的同步对象.Derived3和Derived4的实例具有相同的同步对象.Derived5和Derived6的实例具有相同的同步对象.但是三个同步对象都是不同的对象.

  • @phoog:好问题.没有; 泛型类型的不同结构是*不同类型*.`Base <string>`和`Base <FileInfo>`是不同的类型,因此`Base <string> .sync`和`Base <FileInfo> .sync`是不同的字段.事实上,作为一个实现细节,抖动将jit*base <string>`和`Base <FileInfo>`的*methods*并重新使用jitted状态根本不会改变它们*不同的事实类型*. (4认同)
  • Eric,因为通用代码对所有引用类型都进行了一次jit,这是否意味着`类Derived4:Base <FileInfo> {...}`将与`Derived3`共享同一个同步对象? (2认同)