注意:关于Singleton类的不,如Gamma94中所述(确保只有一个对象被实例化。)
我阅读了关于@Singleton属性的Guice documentation:
Classes annotated @Singleton and @SessionScoped must be threadsafe.
即使我不打算从多个线程访问该对象,是不是这种情况?如果是这样,为什么?
答案 0 :(得分:7)
如果只从一个线程访问一个对象,它就不需要是线程安全的,即使它是一个Guice @Singleton
。 Guice不会在内部执行任何可能导致非线程安全单例断开的多线程...构建Injector
的过程全部在调用Guice.createInjector
的线程上完成,并且任何动态配置都已完成在调用provider.get()
的线程上。当然,单例只会被创建一次,然后每次需要时返回...当它被创建时取决于它是否被绑定为 eager 单例(总是在启动时创建)以及是否Injector
创建Stage.DEVELOPMENT
(仅在需要时创建)或Stage.PRODUCTION
(在启动时创建)。
通常情况下,单个人可以同时从多个线程访问(特别是在Web应用程序中),因此警告。虽然许多开发人员会理解单例在这种情况下需要线程安全,但其他开发人员可能不会,并且我认为值得警告它们是值得的。