Вопрос о безопасности полей экземпляра и происхождения потоков - PullRequest
0 голосов
/ 08 апреля 2009

В C # поле класса означает, что у каждого потока есть свой экземпляр этого объекта.

например. поток 1 будет иметь свой собственный экземпляр объекта a, как и объект b.

Таким образом, 2 пользователя веб-приложения на разных компьютерах должны обращаться к полю экземпляра (скажем, коллекции) в разных потоках, верно?

Это заставляет меня задаться вопросом, зачем мне писать код для синхронизации коллекции? Если коллекция основана на экземплярах, а не на общем состоянии.

Только ли из-за того, что у меня может быть другая попытка потока прочитать коллекцию, когда я изменяю ее состояние. Я говорю «Это так», потому что это только возможный случай с помощью кода, который я на самом деле пишу? Например. порождает один поток для чтения несинхронизированной коллекции и использует исходный поток для записи в коллекцию. Или есть еще какие-то ошибки?

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

Спасибо

1 Ответ

2 голосов
/ 08 апреля 2009

В C # класс по умолчанию НЕ имеет своего собственного экземпляра каждого объекта.

Экземпляры и потоки класса являются двумя отдельными конструкциями (если член не помечен как [ThreadStatic] или какое-либо другое исключение). Если вы создаете экземпляры, а затем запускаете отдельный поток, он будет работать с теми же экземплярами (если только отдельный поток не создает свои собственные экземпляры объектов).

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

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

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