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

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

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

87
задан Jim Aho 20 October 2018 в 20:04
поделиться

4 ответа

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

Примерами общего состояния могут быть:

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

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

  • позаботиться о том, чтобы не изменять состояние, когда оно может быть совместно использовано (лучше: используйте неизменяемые объекты для представления состояния, и сделать снимок состояния в локальную переменную - то есть вместо того, чтобы повторно ссылаться на something.SomeData , вы читаете something.SomeData один раз в локальную переменную, а затем просто используйте переменную - обратите внимание, что это помогает только для неизменяемого состояния!)
  • синхронизировать доступ к данным (все потоки должны синхронизироваться) - либо взаимно исключающие, либо (более детализированные) считыватель / писатель
88
ответ дан 24 November 2019 в 07:50
поделиться

Статические методы подходят для нескольких потоков.

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

14
ответ дан 24 November 2019 в 07:50
поделиться

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

Неважно, статичен метод или нет, важно, статичны данные или нет.

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

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

24
ответ дан 24 November 2019 в 07:50
поделиться

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

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

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

7
ответ дан 24 November 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: