1

可能重复:
为什么不推荐使用 (javax.servlet.)SingleThreadModel?

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

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

我试图了解这个关于线程安全权衡的决定的原因。

4

2 回答 2

3

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

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

于 2012-06-28T15:08:45.360 回答
1

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

请参阅此线程以获取更多信息。

于 2012-06-28T15:17:29.653 回答