2016-12-16 114 views
4

对于Spring如果我有两个同时访问单例bean的请求?一个请求是否必须等到另一个才能完成。 Spring容器如何为我的请求找到单例bean实例?Spring如何同时为单个bean提供多个请求

对于servlets,如果我有两个请求同时访问普通类的普通方法(不静态没有其他复杂的东西)?一个请求是否必须等到另一个请求完成以避免并发(同时两个请求试图访问同一个类的对象)。 Web容器如何为我的请求找到实例?

+1

除非您执行某种“同步”以防止多个线程同时执行方法,否则不需要等待。 – Kayaman

回答

5

对于Spring,如果我有两个请求同时访问singleton bean ?一个请求是否必须等到 完成?

Spring容器为singleton bean类创建一个且只有一个实例(如Controller,Service类等)。 在Java中,有几种方法可以安全地为类创建单例实例,您可以在此查看更多here。一旦Spring容器创建了单例实例,那么将使用该控制器/服务类的单个实例来提供Web请求。

此外,即使两个请求访问单例bean,也不会有任何问题(即,两者之间不会有任何等待),因为它们将在两个单独的线程中提供服务,并且您需要确保的是您的控制器和服务类(即,单例范围的bean)不携带/保持任何状态(即它们是无状态的)并且是线程安全的

Spring容器如何为我的 请求找到单例bean实例?

Spring容器创建,然后注入你已经使用XML或通过注释提供基于配置的单bean实例。

对于servlets,如果我有两个请求访问正常类的 正常方法(不静态没有其他复杂的东西)在同一时间? 是否有一个请求必须等到另一个请求完成以避免 并发(同时两个请求试图访问相同类的 对象)?

否,每个请求将在一个单独的线程来处理这样一个请求将不等待其他请求要被服务/完成,亦即,换言之,该请求将被供应/并行处理。这是通过使用/管理线程池的Web容器来实现的。

Web容器如何为我的请求找到实例?

Web容器(如Tomcat等))创建并加载所有servlet类(如Spring的DispatcherServlet或您自己的自定义servlet),然后一旦Web请求来自客户端(如浏览器),它将根据网络中配置的url-pattern处理到servlet。 XML或通过注释。

+0

你应该说singleton bean应该是无状态的,并且所有的方法都必须是线程安全的...... –

+0

现在,根据你的回答,如果请求由两个单独的线程处理,那么servlet如何确保对象的状态获取不被其他线程修改? (如果你不明白我的观点,你可以澄清).. – 008ak89