【问题标题】:How does Spring bean Handle concurrencySpring bean如何处理并发
【发布时间】:2012-11-26 10:28:41
【问题描述】:

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

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

【问题讨论】:

    标签: spring thread-safety javabeans


    【解决方案1】:

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

    另见:

    【讨论】:

    • 是的。但是当我们的 bean 有一个字段时,我们如何最好地处理并发呢?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我不想在下一个线程尝试写入 bean 成员字段时阻塞它。你有推荐的技术来实现这一点吗?
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-27
          • 2014-12-03
          相关资源
          最近更新 更多