According to the Servlet 2.3 specs,
A servlet container may send concurrent requests through the service method of
the servlet. To handle the requests the developer of the servlet must make adequate
provisions for concurrent processing with multiple threads in the service method.
E pluribus unum, but it's really the other way around in this case.
The J2EE spec says there is only one instance per servlet class running in one web container for non single thread servlet.
To be perfectly nitpicky about this,
The servlet declaration which is part of the deployment descriptor of the web application
containing the servlet, as described in Chapter SRV.13, “Deployment Descriptor”, controls how the servlet container provides instances of the servlet.
For a servlet not hosted in a distributed environment (the default), the servlet container must use only one instance per servlet declaration. However, for a servlet
implementing the SingleThreadModel interface, the servlet container may instantiate multiple instances to handle a heavy request load and serialize requests to a particular instance.
In the case where a servlet was deployed as part of an application marked in the deployment descriptor as distributable, a container may have only one instance per servlet declaration per virtual machine (VM). However, if the servlet in a distributable application implements the SingleThreadModel interface, the container
may instantiate multiple instances of that servlet in each VM of the container.
In short, for every distinct servlet-name you define in your web.xml for a given servlet class, you get a servlet instance that corresponds to that name. This is done so that multiple servlet instances of the same servlet class may possibly have different initial parameters (using the init-param tags).
-anthony
-anthony