对于Servlet,在被客户端第一次访问时,容器会创建该类的一个实例,并且只创建这一个实例(不实现SingleThreadModel 接口的情况下)。servlet支持是多线程的,容器会为每一个客户分配一个线程。servlet不是线程安全的,不过如果我们不在servlet里定义实例变量,那么servlet还是挺安全的,如果实现了SingleThreadModel 接口,将导致 Web 容器会为该Servlet类创建多个 servlet 实例。
如果你写的servlet没有实现SingleThreadModel接口,但是如果你在web.xml中这样定义。
<servlet>
<servlet-name>RegistServlet1</servlet-name>
<servlet-class>servlet.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegistServlet1</servlet-name>
<url-pattern>/regist1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RegistServlet2</servlet-name>
<servlet-class>servlet.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegistServlet2</servlet-name>
<url-pattern>/regist2</url-pattern>
</servlet-mapping>
如果你在同一个浏览器的两个窗口分别访问:/regist1和/regist2,
那么web容器也会为该RegistServlet类创建两个实例,它们互相独立。不过从<servlet-name>不同看出,这不是同一个servlet了,只是映射的是同一个Servlet类。
如果你写的servlet没有实现SingleThreadModel接口,但是如果你在web.xml中这样定义。
<servlet>
<servlet-name>RegistServlet1</servlet-name>
<servlet-class>servlet.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegistServlet1</servlet-name>
<url-pattern>/regist1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>RegistServlet2</servlet-name>
<servlet-class>servlet.RegistServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegistServlet2</servlet-name>
<url-pattern>/regist2</url-pattern>
</servlet-mapping>
如果你在同一个浏览器的两个窗口分别访问:/regist1和/regist2,
那么web容器也会为该RegistServlet类创建两个实例,它们互相独立。不过从<servlet-name>不同看出,这不是同一个servlet了,只是映射的是同一个Servlet类。