2009-10-23 90 views
1

我正在使用MULE和Spring的项目。在上下文中,我们创建提供服务的bean。所有的bean基本上都是线程安全的单例。这是一种流行/推荐的书写服务方式吗?弹簧+线程安全单例

+0

我发现一个网址http://blog.webscale.co.in/?p=64说弹簧注射不是线程安全的!矛盾!!任何人都可以请帮忙吗? – 2011-02-15 13:19:50

回答

2

默认情况下,Spring中的bean将是一个单例,这是您描述的一种非常常见的情况。

0

可能是有问题的表现明智。如果你有很多线程在争夺相同的服务。该bean被定义为线程安全的,因此来自不同线程的访问将被有效地序列化。

+0

如果你在某种共享状态下做同步块,这真的只是一个问题。如果您没有对并发进行任何锁定,则使用单例的性能差异可以忽略不计。 – 2009-10-23 16:37:10

+0

这是我想探讨的问题; AFAIK尝试访问单身人士将被序列化。它是一个线程安全的单例的事实意味着不需要锁定。所以,因为bugspy.net建议访问将被序列化。当然这是可扩展性的抑制因素? – user195166 2009-10-25 23:10:56

+0

我不确定Spring对单身人士的访问是否自动进行序列化。检查这个。我认为这是单身人士的责任,要序列化并锁定任何需要被锁定的信息 – GabiMe 2009-10-25 23:19:34

0

在我们的RESTful服务,我们建立了我们的入口点的

@com.sun.jersey.spi.resource.PerRequest

基础上,

@org.springframework.context.annotation.Scope("request")

这使我们的吞吐量上升,但我们监测,以确保GC是好的足以不要臃肿的应用程序。

Spring单例本质上是线程安全的,加上这是默认范围 - 在我们所有的Web应用程序中使用它们时表现都非常好。

+0

我对Spring很新,所以请忍受一下。当你说“Spring singletons本质上是线程安全的”。我是否仍然必须以线程安全的方式在bean中编写我的代码,以确保它是真实的,即我不应该创建任何模块级变量的新实例,因为下一个线程可能会使用它们? – user195166 2009-10-25 23:29:57

+1

那么,如果你使用Spring的“依赖注入”,那么你不用担心生命周期,因此你不需要手动实例化bean - 这就是为什么你有Spring。所以,基本上你告诉Spring类'A'需要注入类'B',而Spring创建'A'和'B'并将'B'的一个实例注入到'A'的一个实例中。默认情况下,Spring创建2个bean的** singleton **实例,但是你的类需要本质上是线程安全的,即它们应该是无状态的。如果你需要保持状态,你可能需要原型,请求或会话范围。 – 2009-10-26 04:36:26

+0

看看这个范围http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-scopes – 2009-10-26 04:38:48