Одиночки в многопоточной среде

#multithreading #language-agnostic #synchronization #singleton

#многопоточность #не зависит от языка #синхронизация #синглтон

Вопрос:

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

Я не пробовал, но теоретически кажется, что ответ положительный, и вам потребуется синхронизация (или пропустите синглтон)

Комментарии:

1. Синглтон и синхронизированный доступ к полям экземпляра предназначены для решения разных задач.

2. что вы подразумеваете под «пропустить синглтон»?

3. Следует ли пристегиваться при курении крэка?

Ответ №1:

Когда вы обращаетесь к объекту (или тем же изменяемым данным) из нескольких потоков (или процессов), вам потребуется какая-то синхронизация. Нет разницы, является ли это синглтоном или любым другим «не синглтоновым» объектом.

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

Ответ №2:

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

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

Ответ №3:

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

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

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

Я просто на самом деле не сторонник синглтонов, поскольку они, как правило, приводят к потребности в большем количестве синглтонов, чего неизбежно следует избегать.

Ответ №4:

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