For the general case - non-distributed, multi-threaded, it is guaranteed that there will be only one instance of the servlet. From the Servlet 3.0 specification:
2.1 Request Handling Methods
The basic Servlet interface defines a service method for handling client requests. 
  This method is called for each request that the servlet container routes to an instance 
  of a servlet. 
  The handling of concurrent requests to a Web application generally requires that the 
  Web Developer design servlets that can deal with multiple threads executing within 
  the service method at a particular time.
  Generally the Web container handles concurrent requests to the same servlet by 
  concurrent execution of the service method on different threads. 
2.2 Number of Instances
The servlet declaration which is either via the annotation as described in Chapter 8, 
  “Annotations and pluggability” or part of the deployment descriptor of the Web 
  application containing the servlet, as described in Chapter 14, “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 Java Virtual Machine (JVM™)1. However, if the servlet in a 
  distributable application implements the SingleThreadModel interface, the container 
  may instantiate multiple instances of that servlet in each JVM of the container.