В моем Приложении у меня есть статический метод, который называют от нескольких потоков одновременно. Есть ли опасность моих перепутываемых данных?
В моей первой попытке метод не был статическим, и я создавал несколько экземпляр класса. В этом случае мои данные были перепутаны так или иначе. Я не уверен, как это происходит, потому что это только иногда происходит. Я все еще отлаживаю. Но теперь метод является статическим на, у меня нет проблем до сих пор. Возможно, это - просто удача. Я не знаю наверняка.
Переменные, объявленные внутри методов (за возможным исключением переменных « захваченных »), изолированы, поэтому вы не получите никаких внутренних проблем; однако, если ваш статический метод обращается к любому общему состоянию, все ставки отключены.
Примерами общего состояния могут быть:
Если у вас есть совместно используемое состояние, вы должны либо:
something.SomeData
, вы читаете something.SomeData
один раз в локальную переменную, а затем просто используйте переменную - обратите внимание, что это помогает только для неизменяемого состояния!) Статические методы подходят для нескольких потоков.
Статические данные, с другой стороны, могут вызвать проблему, поскольку необходимо контролировать попытки доступа к одним и тем же данным из разных потоков, чтобы гарантировать, что только один поток одновременно читает или записывает данные.
Да, это просто удача. ;)
Неважно, статичен метод или нет, важно, статичны данные или нет.
Если каждый поток имеет свой отдельный экземпляр класса со своим набором данных, то нет риска, что данные будут перепутаны. Если данные статичны, то существует только один набор данных, и все потоки используют одни и те же данные, поэтому нет возможности их не перепутать.
Если ваши данные в отдельных экземплярах все равно смешиваются, то это, скорее всего, потому, что данные на самом деле не являются отдельными.
MSDN Всегда говорит :
Любые публичные статические (Shared в Visual Basic) члены этого типа потокобезопасны. Любые члены экземпляра не гарантируют потокобезопасность.
Редактировать: Как говорят здесь ребята, это не всегда так, и очевидно, что это относится к классам, разработанным таким образом в BCL, а не к классам, созданным пользователем, где это не применяется.