【问题标题】:What is design principle behind Servlets being Singleton [duplicate]Servlet 是 Singleton 背后的设计原则是什么 [重复]
【发布时间】:2012-06-30 03:20:49
【问题描述】:

可能重复:
Why is (javax.servlet.)SingleThreadModel deprecated?

servlet 容器“通常”创建一个 servlet 实例和同一实例的不同线程来服务多个请求。 (我知道这可以使用已弃用的 SingleThreadModel 和其他功能进行更改,但这是通常的方式)。

我认为,这背后的简单原因是性能提升,因为创建线程比创建实例更好。但似乎这不是原因。 另一方面,创建实例几乎没有优势,开发人员不必担心线程安全。

我正在尝试了解做出此决定的原因,以权衡线程安全性。

【问题讨论】:

  • “同一实例的不同线程”是什么意思。你说的是 servlet 处理程序线程池吗?
  • @Gray 是的,我说的是 servlet 处理程序线程池。
  • @thinksteep 你能把它放在答案中吗,它会接受它并结束讨论。

标签: java multithreading servlets singleton design-principles


【解决方案1】:

这是关于性能的。如果没有状态,就没有锁定和争用。 Servlet 是基本的构建块,在这个级别上构建关于状态的假设并不是一个好主意。

servlet 只是一种说法,容器收到了这个请求,这是应用程序对它做某事的机会。任何关于需要何种状态的假设都可能对某些应用程序有利,而对其他应用程序不利,因此 servlet 对此进行了抨击。如果有一个通用的设计原则在起作用,那就是保持足够简单以便普遍有用。

【讨论】:

    【解决方案2】:

    请注意,SingleThreadModel 并不能解决所有线程安全问题。 例如,会话属性和静态变量仍然可以 由多个线程上的多个请求同时访问, 即使使用 SingleThreadModel servlet。建议 开发人员采取其他方式来解决这些问题,而不是 实现这个接口,比如避免使用实例 变量或同步访问这些的代码块 资源。

    请参考this thread 了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 2011-06-20
      • 1970-01-01
      • 2010-10-17
      相关资源
      最近更新 更多