servlet容器“通常”创建一个servlet实例和同一实例的不同线程来提供多个请求。 (我知道这可以使用已弃用的SingleThreadModel和其他功能进行更改,但这是常用方法。)
我认为,这背后的简单原因是性能提升,因为创建线程比创建实例更好。但似乎这不是原因。 另一方面,创建实例几乎没有优势,开发人员永远不必担心线程安全。
我试图理解这个决定线程安全权的决定的原因。
答案 0 :(得分:3)
关于表现。如果没有状态则没有锁定且没有争用。 Servlet是基本构建块,在关于状态的假设下构建在该级别上并不是一个好主意。
servlet只是一种说法,容器收到了这个请求,这里应用程序有机会对它做一些事情。关于需要什么样的状态的任何假设可能对某些应用程序有好处,对其他应用程序有害,因此servlet就这样做了。如果在工作中存在一般设计原则,那就是保持足够简单的通用性。
答案 1 :(得分:1)
请注意,SingleThreadModel不能解决所有线程安全问题。 例如,会话属性和静态变量仍然可以 多个线程同时访问多个请求, 即使使用SingleThreadModel servlet。建议这样做 开发人员采取其他方式来解决这些问题,而不是 实现此接口,例如避免使用实例 变量或同步访问那些的代码块 资源。
有关详细信息,请参阅this thread。