代码之家  ›  专栏  ›  技术社区  ›  saugata

为什么(javax.servlet.)singlethreadmodel被弃用?

  •  25
  • saugata  · 技术社区  · 15 年前

    为什么是 javax.servlet.SingleThreadModel 不赞成?

    5 回复  |  直到 7 年前
        1
  •  29
  •   skaffman    10 年前

    这个 javadoc 说为什么。 SingleThreadModel 它被设计成一个简单的低负载并发解决方案,但它甚至没有做到这一点:

    注意,singlethreadmodel没有 解决所有线程安全问题。为了 示例,会话属性和静态 变量仍然可以通过 多线程上的多个请求 同时,即使在 使用单线程模型servlet。 建议开发人员 采取其他手段解决这些问题 问题而不是实现这个 接口,例如避免使用 实例变量或 同步代码块 访问这些资源。

    如果它不能达到设计的目的,就不应该使用它。

        2
  •  11
  •   Jon Skeet    15 年前

    它基本上是一种处理并发性的糟糕方法。将状态从servlet中取出,以便同一个servlet可以被多个线程同时使用。将状态保存在一个servlet实例的“池”中,每个实例都可能有前一个请求等遗留下来的状态,这非常糟糕。

        3
  •  4
  •   javaPlease42    11 年前

    是的,不推荐使用单线程模型接口。不要用它。 事实上,您不需要它,而是使用局部变量而不是对象字段,因为“每个线程在Java中获取自己的本地变量副本。只需删除对象字段并用局部变量替换它,就解决了这个特殊的线程问题。” Reference

        4
  •  1
  •   Joe.wang    12 年前

    从JavaServlet规范:

    使用singlethreadmodel接口可以保证只有一个 线程一次将在给定的servlet实例服务中执行 方法。需要注意的是,本保函仅适用于 每个servlet实例,因为容器可以选择将 物体。可由多个servlet实例访问的对象 一次,例如httpsession的实例,可以在任何 多个servlet的特定时间,包括实现 单线程模型。
    建议开发人员采取其他方法来解决这些问题,而不是实现这个接口,例如避免 使用实例变量或同步 访问这些资源的代码。单线程模型接口是 此版本的规范中不推荐使用。

        5
  •  0
  •   Harun ERGUL    7 年前

    如果一个servlet实现 SingleThreadModel 接口,Servlet容器可以根据请求负载创建一个或多个Servlet实例。每个实例将只使用 service() 方法。它解决了线程安全问题,但不是所有问题。例如静态类变量,会话属性仍然不是线程安全的。

    开发人员鼓励使用同步访问这些资源的代码块,而不是使用这个接口。

    推荐文章