当同时多个访问Spring单例实例时

当同时多个访问Spring单例实例时,spring,ioc-container,Spring,Ioc Container,如果您在spring配置的singleton作用域中定义服务,那么如果多个用户同时尝试访问它(即作为注入控制器的依赖项),会发生什么情况?是否会引起冲突?或者IoC容器将保留后面的调用直到第一个调用完成?如果是这样的话,它会降低大型应用程序的性能,这对我来说是不对的。有人能给我一个正确的答案吗 顺便说一句,正如我所记得的,如果不是单例的,IoC容器将根据请求的数量汇集几个实例。有人能证实这一点吗?单身就是单身。一个实例由Spring上下文管理,所有请求都并发地通过该实例。这取决于你,使线程安全

如果您在spring配置的singleton作用域中定义服务,那么如果多个用户同时尝试访问它(即作为注入控制器的依赖项),会发生什么情况?是否会引起冲突?或者IoC容器将保留后面的调用直到第一个调用完成?如果是这样的话,它会降低大型应用程序的性能,这对我来说是不对的。有人能给我一个正确的答案吗


顺便说一句,正如我所记得的,如果不是单例的,IoC容器将根据请求的数量汇集几个实例。有人能证实这一点吗?

单身就是单身。一个实例由Spring上下文管理,所有请求都并发地通过该实例。这取决于你,使线程安全

如果您的bean不是线程安全的,那么考虑使用非独占范围的bean。Spring允许您使用请求、会话和原型作用域

如果多个用户同时尝试访问它(即作为依赖项注入控制器),会发生什么情况

一个单例bean可以被并发访问多次。这就是为什么它总是必须是线程安全的

是否会引起冲突

只有当你不能使它线程安全

或者IoC容器将保留后面的调用直到第一个调用完成

不,那太糟糕了


顺便说一句,正如我所记得的,如果不是单例的,IoC容器将根据请求的数量汇集几个实例。有人能证实吗

Spring具有以下作用域():

  • (每个应用程序只管理一个实例)
  • (每次注射一个新实例)
  • (每个HTTP会话一个实例,仅在Spring MVC中)
  • (每个HTTP请求一个实例,仅在Spring MVC中)
  • (每个全局HTTP会话一个实例,仅在基于portlet的Spring MVC中)
此外:

从Spring3.0开始,线程作用域可用,但默认情况下未注册。有关更多信息,请参阅的文档


您描述的是一个对象池。在春季,这将作为一个原型范围实现。在内部,它将使用类似的库。

感谢您的回复。使单例类线程安全的最佳实践是什么?我认为使用同步块不是一个好主意,因为它对性能来说太昂贵了。@Brolinuk有时需要同步块,有时不需要。请阅读以供进一步参考。基本上:如果没有可变状态,则通常是线程安全的。如果这样做,您将需要某种方法来同步对可变状态的访问。还有一个