2013-08-29 3 views
1

У меня есть класс A со статическим методом aA. Локальные переменные этих методов являются статическими, я также создаю объект B в нем. Представьте, что я создаю несколько объектов класса A, при необходимости вызывая этот статический метод.Статические методы в многопоточном окружении

В реальном мире я загружаю асинхронно документы XML и разбираю их. Метод parse является статическим, и мне интересно, что происходит внутри? Является ли такой вспомогательный метод потоком безопасным? Что происходит со статическими переменными метода?

Будете ли вы любезны и объясните, как статический метод созданного класса ведет себя в многопоточной среде?

+3

Обратите внимание, что «Локальные переменные этих методов * являются статическими *», вероятно, неверны, так как это очень сложно достичь в C# (в отличие от C/C++ нет статических локальных переменных). –

+0

Алексей, ты прав. Статические переменные нестатического класса. –

ответ

0

Статические методы не обязательно потокобезопасны, но они могут быть. Проверьте документацию по конкретному методу, чтобы убедиться, что он потокобезопасен или нет.

2

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

Если статический метод использует только свои аргументы и local переменные (переменные, объявленные в теле метода), то, вероятно, это поточно-безопасный. Если он пишет статические переменные класса или структуры данных или читает из указанных структур, если они могут быть изменены другим потоком, то вы должны синхронизировать доступ к этим данным.

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

1

Способ, статичный или нет, не имеет отношения к тому, является ли он потокобезопасным или нет. Метод экземпляра - это просто статический метод, который принимает скрытый параметр: this. Никакой другой разницы.

Thread-safety - это свойство всей системы, а не отдельных методов. Убедитесь, что вы не пишете переменные, которые читаются или записываются в других потоках одновременно. Убедитесь, что система в целом ведет себя к спецификации перед лицом произвольного планирования потоков.

Трудно сказать больше не видя код.

Смежные вопросы