Guice:为什么@ Singleton-annotated类必须是不可变的/线程安全的?

时间:2011-05-25 18:46:31

标签: unit-testing dependency-injection junit scope guice

注意:关于Singleton类的,如Gamma94中所述(确保只有一个对象被实例化。)

我阅读了关于@Singleton属性的Guice documentation

Classes annotated @Singleton and @SessionScoped must be threadsafe.

即使我不打算从多个线程访问该对象,是不是这种情况?如果是这样,为什么?

1 个答案:

答案 0 :(得分:7)

如果只从一个线程访问一个对象,它就不需要是线程安全的,即使它是一个Guice @Singleton。 Guice不会在内部执行任何可能导致非线程安全单例断开的多线程...构建Injector的过程全部在调用Guice.createInjector的线程上完成,并且任何动态配置都已完成在调用provider.get()的线程上。当然,单例只会被创建一次,然后每次需要时返回...当它被创建时取决于它是否被绑定为 eager 单例(总是在启动时创建)以及是否Injector创建Stage.DEVELOPMENT(仅在需要时创建)或Stage.PRODUCTION(在启动时创建)。

通常情况下,单个人可以同时从多个线程访问(特别是在Web应用程序中),因此警告。虽然许多开发人员会理解单例在这种情况下需要线程安全,但其他开发人员可能不会,并且我认为值得警告它们是值得的。