Do static locks work across different children classes?

风格不统一 提交于 2019-11-30 05:02:57

问题


If I have

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 ...
    }
}

Will calls to new Child1().Method1() and new Child2().Method1() use the same lock?


回答1:


Yes. A derived class does not get a new copy of the static data from the base class.

However, this is not the case with generic classes. If you say:

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> { ... }

instances of Derived1 and Derived2 have the same sync object. Instances of Derived3 and Derived4 have the same sync object. Instances of Derived5 and Derived6 have the same sync object. But the three sync objects are all different objects.




回答2:


Yes, generally speaking, lock on static objects protect data for all instances of your class.

From MSDN:

Best practice is to define a private object to lock on, or a private static object variable to protect data common to all instances.




回答3:


To add to ken2k's answer: [Yes] ... unless it's marked as [ThreadStatic] (which obviously isn't the case here).



来源:https://stackoverflow.com/questions/9198087/do-static-locks-work-across-different-children-classes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!