为什么javax.servlet.SingleThreadModel
已被弃用?
答案 0 :(得分:29)
javadoc说明原因。 SingleThreadModel
旨在成为低负载并发的简单解决方案,但它甚至没有管理:
请注意,SingleThreadModel不会 解决所有线程安全问题。对于 例如,会话属性和静态 仍然可以访问变量 多个线程上的多个请求 同时,即使在 使用SingleThreadModel servlet。 建议开发人员 采取其他方式解决这些问题 问题而不是实现这一点 界面,如避免使用 实例变量或 同步代码块 访问这些资源。
如果无法达到设计目标,则不应使用它。
答案 1 :(得分:11)
这基本上是一种处理并发的糟糕方式。取而代之的是从servlet中取出状态,以便多个线程可以同时使用相同的servlet。将状态保存在servlet实例的“池”中,每个实例都可以从先前的请求中保留状态等,这非常可怕。
答案 2 :(得分:4)
是不推荐使用SingleThreadModel接口。不要使用它。实际上你不需要它,而是使用局部变量而不是对象字段,因为“每个线程都在Java中获取自己的局部变量副本。通过简单地删除对象字段并将其替换为一个局部变量,解决了这个特殊的线程问题。“ Reference
答案 3 :(得分:1)
来自Java Servlet规范:
SingleThreadModel接口的使用保证只有一个 一次执行的线程将在给定的servlet实例的服务中执行 方法。重要的是要注意,此保证仅适用于 每个servlet实例,因为容器可以选择这样的池 对象。可供多个servlet实例访问的对象 一次,例如HttpSession的实例,可以在任何时候使用 特定时间到多个servlet,包括那些实现的servlet SingleThreadModel的。
建议开发人员采取其他方式解决这些问题,而不是实现此接口,例如避免 使用实例变量或同步块的 访问这些资源的代码。 SingleThreadModel接口是 在此版本的规范中弃用。
答案 4 :(得分:0)
如果servlet实现SingleThreadModel
接口,则servlet容器可以根据请求负载来创建servlet的一个或多个实例。每个实例将仅使用其service()
方法。它解决了线程安全问题,但不是全部。例如静态类变量,会话属性仍然不是线程安全的。
开发人员鼓励使用同步访问这些资源的代码块,而不是使用此接口。