Совет: почему аннотированные классы @ Singleton должны быть неизменяемыми / безопасными для потоков? - PullRequest
2 голосов
/ 25 мая 2011

ПРИМЕЧАНИЕ. Этот вопрос , а не о классах Singleton, как описано в Gamma94 (гарантирует, что только один объект когда-либо будет создан.)

Я прочитал документацию Guice об атрибуте @Singleton:

Classes annotated @Singleton and @SessionScoped must be threadsafe.

Это так, даже если я не собираюсь обращаться к объекту из более чем одного потока? Если так, то почему?

1 Ответ

7 голосов
/ 26 мая 2011

Если доступ к объекту возможен только из одного потока, он не должен быть потокобезопасным, даже если это Guice @Singleton.Guice не выполняет внутреннюю многопоточность, которая может привести к сбою не поточечного синглтона ... процесс создания Injector полностью выполняется в потоке, который вызывает Guice.createInjector, и любая динамическая подготовка выполняется в потоке,звонки provider.get().Конечно, синглтон будет создаваться только один раз, а затем просто возвращаться каждый раз, когда он необходим ... когда он создается, зависит от того, связан ли он как eager singleton (всегда создается при запуске) иInjector создается в Stage.DEVELOPMENT (создается только при необходимости) или Stage.PRODUCTION (создается при запуске).

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

...