2011-05-25 21 views
2

注:这个问题是在Gamma94描述不约辛格尔顿类(确保只有一个对象曾经被实例化。)Guice:为什么必须@ Singleton注释的类不可变/线程安全?

我看Guice documentation关于@Singleton属性:

Classes annotated @Singleton and @SessionScoped must be threadsafe. 

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

+0

“线程安全”意味着对象的行为与预期相同,即使同时由2个或更多线程访问。现在,如果您100%确定您的对象只能由一个线程访问(例如,因为您的整个应用程序是单线程的),那么它将在应用程序的上下文中自动进行线程安全。 – jfpoilpret 2011-05-25 21:59:02

回答

7

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

虽然(特别是在web应用程序中),通常情况下singletons可以从多个线程同时访问,因此是警告。虽然很多开发人员都会明白,在这种情况下单身人士应该是线程安全的,但其他人可能不会,我认为值得警惕的是他们。

+0

谢谢科林。如果他们在文档中留下那些看似明显的通用编程建议(以确保要通过多线程访问的类被设计为可以这样做),它会为我省去很多困惑。 – 2011-05-26 03:23:29

+0

@glenviewjeff:使单线程线程化,安全是合理的建议。如果文档中说Singletons必须在Guice的上下文中是线程安全的,那么你最好让它们线程安全。否则,你基本上违反了他们的合同,他们不能保证你的代码会按预期行事。单线程很容易让线程安全,所以你可以这样做。 – 2011-05-26 05:04:10

+0

@罗伯特,我就是这么想的,如果吉斯这么说,我最好听听这个建议,直到我得到一个更明确的答案和解释。问题在于使单线程线程安全并不像你想象的那么容易,因为我调用了一个(有点模糊的)ORM,而且我不确定这些方法的线程安全性。 – 2011-05-26 19:30:02

相关问题