На C#: что делать, если статический метод вызывается из нескольких потоков?
в моем приложении у меня есть статический метод, который вызывается из нескольких потоков одновременно. Есть ли опасность того, что мои данные будут перепутаны?
в моей первой попытке метод не был статическим, и я создавал несколько экземпляров класса. В таком случае мои данные как-то перепутались. Я не уверен, как это происходит, потому что это происходит только иногда. Я все еще отлаживаю. Но теперь метод статичен, у меня пока нет проблем. Может быть, это просто удача. Я не знаю конечно.
4 ответа:
переменные, объявленные внутри методов (возможно, за исключением "плен" переменные) изолированы, поэтому вы не получите никаких внутренних проблем; однако, если ваш статический метод обращается к любому общему состоянию, все ставки выключены.
примеры общий-государство должно быть:
- статические поля
- объекты, доступные из общего кэша (несериализованные)
- данные, полученные с помощью входных параметров (и состояние этих объектов), если это возможно, что несколько потоков касаются одного и того же объекта(ов)
Если у вас есть общее состояние, вы должны:
- позаботьтесь о том, чтобы не мутировать состояние, как только оно может быть общим (лучше: используйте неизменяемые объекты для представления состояния и сделайте снимок состояния в локальную переменную - т. е. вместо ссылки
whatever.SomeData
неоднократно, Вы читаетеwhatever.SomeData
после в локальную переменную, а потом просто использовать переменную - обратите внимание, что это только помогает за неизменное состояние!)- синхронизировать доступ к данным (все потоки должны синхронизироваться) - либо взаимоисключающие, либо (более детализированные) reader/writer
Да, это просто удача. ;)
не имеет значения, является ли метод статическим или нет, важно, являются ли данные статическими или нет.
Если каждый поток имеет свой собственный отдельный экземпляр класса с его собственным набором данных, нет никакого риска смешивания данных. Если данные статичны, существует только один набор данных, и все потоки используют одни и те же данные, поэтому нет способа не смешивать их.
когда ваши данные в отдельных экземплярах все еще смешиваются, это скорее всего потому, что данные на самом деле не разделены.
MSDN всегда говорит:
все открытые статические (Общие в Visual Basic) элементы этого типа являются потокобезопасными. Члены экземпляров не гарантируется потокобезопасность.
изменить: Как говорят Ребята здесь, это не всегда так, и явно это относится к классам, разработанным таким образом в BCL, а не к пользовательским созданным классам, где это не применяется.