27

我的 Web 应用程序使用 Spring IOC。所以我所有的spring beans默认都是单例的。如果两个请求同时尝试访问单个类的两个不同方法(例如MySpringBean,一个有两个方法searchRecord和的类insertRecord),两个请求将同时访问同一个 spring bean。

同一个 spring bean 如何同时可供两个客户端使用,或者当两个请求都尝试访问两种不同的方法但通过同一个 spring bean 时,这将是并发问题。而且由于 spring bean 是一个单例,所以不能形成新的实例。在这种情况下,这将如何工作?

4

5 回答 5

15

您必须首先了解并发性何时会导致问题。如果您的 Spring bean 是无状态的(它没有任何字段,则所有字段都是final或所有字段都只分配一次),多个线程可以安全地使用同一个 bean,甚至是同一个方法。

也可以看看:

于 2012-12-08T10:50:19.553 回答
6

如果 bean 是单例,那么 Spring 将在任何线程中为您提供相同的实例。使该 bean 线程安全取决于您。因为它是一个单例,你最好让那个类成为无状态的。

于 2012-12-08T10:50:22.410 回答
6

正如其他人已经建议的那样,在“单例”bean 的情况下,Spring 将为所有线程提供相同的实例。

您需要了解的是,线程通过执行代码来完成系统中的所有工作,而对象提供状态和行为(代码)。因此,多个线程(在您的情况下为请求)确实有可能在单例 bean 中同时运行相同的方法。您可以按照 Tomasz 的建议使此类 bean 无状态,或者使它们成为“线程安全的”。

于 2012-12-09T03:16:01.363 回答
0

在 Spring 中,每个请求都将在单独的线程中创建。例如,它们可以称为“searchRecord”线程和“insertRecord”线程。它们都会在堆中找到相同的对象,但每个线程都会创建自己的执行堆栈。

于 2021-09-20T00:49:31.967 回答
0

Java 单例和 Spring 单例是不同的。Spring 单例范围将在上下文中可用。

Java 单例范围将在 JVM 类加载器中。因此并发请求只能通过 spring 上下文

于 2018-09-22T15:30:47.877 回答