Spring 弹簧&x2B;线程安全单例

Spring 弹簧&x2B;线程安全单例,spring,Spring,我在做一个项目,我们用骡子和弹簧。在上下文中,我们创建了提供服务的bean。所有bean本质上都是线程安全的单例。这是一种流行/推荐的编写服务的方式吗?默认情况下,spring中的bean将是一个单例,这是您描述的一个非常常见的场景。可能在性能方面存在问题。如果有多个线程竞争同一个服务。bean被定义为线程安全的,因此来自不同线程的访问将被有效地序列化 在我们的RESTFul服务中,我们在 @com.sun.jersey.spi.resource.PerRequest 基础与 @org.spri

我在做一个项目,我们用骡子和弹簧。在上下文中,我们创建了提供服务的bean。所有bean本质上都是线程安全的单例。这是一种流行/推荐的编写服务的方式吗?

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

可能在性能方面存在问题。如果有多个线程竞争同一个服务。bean被定义为线程安全的,因此来自不同线程的访问将被有效地序列化

在我们的RESTFul服务中,我们在

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

基础与

@org.springframework.context.annotation.Scope(“请求”)

这可以保持我们的吞吐量,但我们会监控以确保GC足够好,不会使应用程序膨胀


Spring Singleton本质上是线程安全的,而且这是默认的作用域——它在我们所有的web应用程序中使用时表现得非常好。

只有在某种共享状态下执行同步块时,这才是真正的问题。如果您没有对并发进行任何锁定,那么使用单例的性能差异可以忽略不计;AFAIK访问单例的尝试将被序列化。它是线程安全的单例,这意味着不需要锁定。因此,正如bugspy.net建议的那样,访问将被序列化。这肯定是可伸缩性的障碍吗?我不确定Spring是否会自动序列化对singleton的访问。看看这个。我认为单亲家庭有责任序列化并锁定需要锁定的任何东西我对Spring还比较陌生,所以请耐心等待我。。当你说“Spring单例本质上是线程安全的”;我是否仍然必须以线程安全的方式在bean中编写代码才能做到这一点,即我不应该创建任何模块级变量的新实例,因为中的下一个线程可能会使用它们?如果您使用Spring进行“依赖项注入”这样,您就不必担心生命周期,因此不必手动实例化bean——这就是为什么您有Spring。所以基本上你告诉Spring类
A
需要注入类
B
,Spring创建
A
B
,并将
B
的一个实例“注入”到
A
的一个实例中。默认情况下,Spring创建2个bean的单例实例,但您的类需要本质上是线程安全的,即它们应该是无状态的。如果您需要保持状态,您可能需要原型、请求或会话作用域。生命周期。我关心的是线程排队的问题。对于我的例子,我有一个Spring上下文。正如文档所述,将只有一个singleton实例。现在假设我有一个名为CalculateTax的方法。正如你所说,这个类是无状态的。现在一个请求进入,一个线程被创建(tA),它最终进入CalculateTax方法。在相同的“时间范围”内,另一个请求进入并创建另一个线程(tB)。现在,我想了解的是。在tA退出该方法之前,AFAIK tB无法执行CalculateAX。这是真的吗?啊!您正在使用请求范围,因此您不会遇到我正在调查的潜在问题。我发现一个url说spring注入不是线程安全的!矛盾有人能帮忙吗?