Работают ли статические блокировки в разных дочерних классах? - PullRequest
7 голосов
/ 08 февраля 2012

Если у меня есть

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 ]

16 голосов
/ 08 февраля 2012

Да.Производный класс не получает новую копию статических данных из базового класса.

Однако это не относится к универсальным классам.Если вы говорите:

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 имеют одинаковый объект синхронизации.Но все три объекта синхронизации - это разные объекты.

2 голосов
/ 08 февраля 2012

Добавить к ответу ken2k: [Да] ... если только он не помечен как [ThreadStatic] (что, очевидно, здесь не так).

2 голосов
/ 08 февраля 2012

Да, вообще говоря, lock на static объектах защищают данные для всех экземпляров вашего класса.

От MSDN :

НаилучшееНа практике необходимо определить закрытый объект или переменную закрытого статического объекта для защиты данных, общих для всех экземпляров .

...