为什么(javax.servlet。)不推荐使用SingleThreadModel?

时间:2010-03-31 10:16:04

标签: java multithreading servlets

为什么javax.servlet.SingleThreadModel已被弃用?

5 个答案:

答案 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()方法。它解决了线程安全问题,但不是全部。例如静态类变量,会话属性仍然不是线程安全的。

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