На C#: что делать, если статический метод вызывается из нескольких потоков?


в моем приложении у меня есть статический метод, который вызывается из нескольких потоков одновременно. Есть ли опасность того, что мои данные будут перепутаны?

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

4 79

4 ответа:

переменные, объявленные внутри методов (возможно, за исключением "плен" переменные) изолированы, поэтому вы не получите никаких внутренних проблем; однако, если ваш статический метод обращается к любому общему состоянию, все ставки выключены.

примеры общий-государство должно быть:

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

Если у вас есть общее состояние, вы должны:

  • позаботьтесь о том, чтобы не мутировать состояние, как только оно может быть общим (лучше: используйте неизменяемые объекты для представления состояния и сделайте снимок состояния в локальную переменную - т. е. вместо ссылки whatever.SomeData неоднократно, Вы читаете whatever.SomeDataпосле в локальную переменную, а потом просто использовать переменную - обратите внимание, что это только помогает за неизменное состояние!)
  • синхронизировать доступ к данным (все потоки должны синхронизироваться) - либо взаимоисключающие, либо (более детализированные) reader/writer

Да, это просто удача. ;)

не имеет значения, является ли метод статическим или нет, важно, являются ли данные статическими или нет.

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

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

статические методы должны быть хорошо для нескольких потоков.

MSDN всегда говорит:

все открытые статические (Общие в Visual Basic) элементы этого типа являются потокобезопасными. Члены экземпляров не гарантируется потокобезопасность.

изменить: Как говорят Ребята здесь, это не всегда так, и явно это относится к классам, разработанным таким образом в BCL, а не к пользовательским созданным классам, где это не применяется.