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

Jef*_*rod 2 junit unit-testing scope dependency-injection guice

注意:这个问题不是关于Gamma94中描述的Singleton类(确保只有一个对象被实例化).

我阅读了关于@Singleton属性的Guice文档:

Classes annotated @Singleton and @SessionScoped must be threadsafe.
Run Code Online (Sandbox Code Playgroud)

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

Col*_*inD 7

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

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

  • @glenviewjeff:这与Singleton(静态实例)设计模式无关.Guice不会在内部执行任何可能导致非线程安全单例断开的多线程...构建`Injector`的过程都是在调用`Guice.createInjector`的线程上完成的,并且任何动态配置都是在调用`provider.get()`的线程. (3认同)