2012-06-05 2 views
1

Недавно мой коллега придумал фрагмент кода и спросил мое мнение относительно безопасности потока кода. Ниже приведен пример, иллюстрирующий тот же сценарий, что и код.Поведение потоков методов объекта класса, объявленного как статический член другого класса

public class classA 
{ 
    public int DoWorkA() 
    { 
     //some logic 
    } 
} 

public class classB 
{ 
    public static classA objA = new classA(); 
} 

public class classC 
{ 
     int DoWorkC() 
     { 

      return classB.objA.DoWorkA(); 

     } 
} 

Теперь, если ClassB.objA.DoWorkA() вызывается simulatenously в различных случаях различных классов, как ClassC, ClassD и т.д. будет ли какой-либо резьбы или проблемы «перекрытия»? Должна ли objA быть преобразована в член экземпляра?

ответ

2

Поскольку objA является статическим, будет всего один экземпляр classA. Это означает, что все потоки обращаются к методу DoWorkA() на в том же экземпляре, но это не значит, что вызов метода является потокобезопасным - это полностью зависит от реализации DoWorkA().

Для защиты от проблем, возникающих при одновременном доступе, по-прежнему потребуется соответствующая логика в DoWorkA. использование блокировки или поточно-коллекций и т.д.

+0

Достаточно ли, если DoWorkA() работает только с локальными переменными (в рамках DoWorkA()), а не для членов класса, чтобы сделать его потокобезопасным? Должен ли я использовать блокировки? – devanalyst

1

будет ли нарезание резьбы или «Перекрытие» выпускает

Это зависит от того, что делает //some logic. Каждый вызов будет иметь один и тот же экземпляр, поэтому DoWorkA должен быть потокобезопасным, чтобы он функционировал правильно.

Любые данные, используемые в пределах //some logic, требуют правильной синхронизации, чтобы это было безопасно.

+0

Существует также потенциальное условие гонки на конструкторе 'classA' –

+0

@ConradFrix Этот конструктор гарантированно будет вызываться только один раз по спецификации C#. Единственным способом было бы условие гонки, если бы ClassA использовал общие/статические данные в своем конструкторе, что само по себе было небезопасным. –