Servlets 单线程与单线程

Servlets 单线程与单线程,servlets,concurrency,Servlets,Concurrency,通常servlet只启动一次,web容器simple为每个用户请求生成一个新线程。假设我从头开始创建自己的web容器,而不是线程,我只是将servlet创建为单例。我会错过什么吗?我猜,在这种情况下,singleton一次只能为一个用户请求提供服务,而不能为多个用户请求提供服务 基本上就是这样 我会质疑创建您自己的容器的动机,因为有这么多容器可用于多种用途。JavaEE过去有一种机制来实现这一点——一个名为SingleThreadModel的标记接口,您的servlet可以实现: 确保servl

通常servlet只启动一次,web容器simple为每个用户请求生成一个新线程。假设我从头开始创建自己的web容器,而不是线程,我只是将servlet创建为单例。我会错过什么吗?我猜,在这种情况下,singleton一次只能为一个用户请求提供服务,而不能为多个用户请求提供服务

基本上就是这样


我会质疑创建您自己的容器的动机,因为有这么多容器可用于多种用途。

JavaEE过去有一种机制来实现这一点——一个名为
SingleThreadModel
的标记接口,您的servlet可以实现:

确保servlet一次只处理一个请求。此接口没有任何方法

如果一个servlet实现了这个接口,那么可以保证在servlet的服务方法中不会有两个线程同时执行。servlet容器可以通过同步对servlet的单个实例的访问,或者通过维护servlet实例池并将每个新请求分派给一个空闲servlet来实现这一保证

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

容器可以使用它为每个请求实例化一个新的servlet,或者维护一个servlet池(如果他们愿意的话)

出于上述原因,Servlet2.4中不推荐使用这种方法。这些同样的理由仍然适用于你的问题

通常servlet只启动一次,web容器simple为每个用户请求生成一个新线程

第一句话是对的,但第二句话实际上不是。通常,线程在应用程序启动期间创建一次,并保存在线程池中。当线程完成其请求-响应处理作业时,它将返回到池中。这也是为什么在servletcontainer中使用
ThreadLocal
时必须非常小心的原因

假设我从头开始创建自己的web容器,而不是线程,我只是将servlet创建为单例。我会错过什么吗

它们不一定需要遵循单例模式。只需在应用程序启动期间创建它们的一个实例,并在应用程序的整个生命周期中将它们保存在内存中,只需让所有线程访问同一个实例

我猜,在这种情况下,singleton一次只能为一个用户请求提供服务,而不能为多个用户请求提供服务


事实并非如此。只有在应用程序范围的锁上同步对singleton方法的访问时,才会发生这种情况。例如,在servlet的方法中添加
synchronized
修饰符,或者在将请求委托给servlet的经理的方法中添加
synchronized(this)

您试图解决的目标/目的或问题是什么。当然,他不会真的重新发明轮子。