【问题标题】:Guice Singleton and ServletGuice Singleton 和 Servlet
【发布时间】:2013-07-09 09:42:38
【问题描述】:

我正在使用 Guice,我有一个问题。有一个 servlet 是 Singleton。 JVM 中只有一个此类的实例还是只有一个 Session 范围的实例?那么对这个类的并发访问呢?

【问题讨论】:

    标签: java servlets singleton guice


    【解决方案1】:

    您的 servlet 资源的并发访问会有任何问题。 Servlet 容器会很好地处理它,它会在每次请求时生成新线程并传递该 servlet 引用,然后请求将被处理。

    最好让你的servlet单线程确认单个内存空间的使用,所以容器将是轻量级的。在 spring 中可以使用相同的概念,默认情况下每个 bean 都是单例的。

    【讨论】:

      【解决方案2】:

      我不确定 Guice,但容器确保 每个 JVM DD 中的每个定义只存在一个 Servlet 实例,根据规范,除非您的 Servlet 实现邪恶的 SingleThreadModel。 Container 将为每个 request 生成一个新线程,调用 service() 方法。

      此外,类和实例变量不是线程安全的。只有局部变量是线程安全的。

      【讨论】:

        【解决方案3】:

        实际上,Guice 需要 servlet,它设法成为单例:

        注意:每个 servlet(或过滤器)都必须是 @Singleton。如果不能直接注释类,则必须使用 bind(..).in(Singleton.class) 绑定它,与 filter() 或 servlet() 规则分开。在任何其他范围内映射都是错误的。这是为了保持与 Servlet 规范的一致性。 Guice Servlet 不支持已弃用的 SingleThreadModel。

        (来自this documentation)

        您有责任正确处理并发访问。

        【讨论】:

        • 我将如何处理并发访问?
        • 这一切都取决于您的应用程序。该框架将允许多个请求同时访问 servlet。您需要确保您的 servlet 所做的事情是安全的。我建议阅读 Brian Goetz 的 Java Concurrency in Practic 以获得很好的概述。
        猜你喜欢
        • 2013-03-13
        • 2016-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 2021-04-03
        • 1970-01-01
        • 2015-04-28
        相关资源
        最近更新 更多