Servlet与线程安全
先说结论,Servlet本身是单例的,线程安全的。但是如果引入共享变量,则可能会变得线程不安全。
1. 什么是线程安全
首先说明一下对线程安全的讨论,哪种情况我们可以称作线程安全?
《Java并发编程实战》给出的定义:
当多个线程访问某个类时,不管运行时环境采用何种调度方式,或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的.
3. Servlet的调用过程
Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。
- 1.客户端通过发送请求给Tomcat,Tomcat发送客户端的请求页面给客户端。
- 2.用户对请求页面进行相关操作后将页面提交给Tomcat,Tomcat将其封装成一个HttpRequest对象,然后对请求进行处理,。
- 3.Tomcat截获请求,根据action属性值查询xml文件中对应的servlet-name,再根据servlet-name查询到对应的java类(如果是第一次,Tomcat则会将servlet编译成java类文件,所以如果servlet有很多的话第一次运行的时候程序会比较慢)。
- 4.Tomcat实例化查询到的java类,注意该类只实例化一次。
- 5.调用java类对象的service()方法(如果不对service()方法进行重写则根据提交的方式来决定执行doPost()方法还是doGet()方法)。
- 6.通过request对象取得客户端传过来的数据,对数据进行处理后通过response对象将处理结果写回客户端。
4. Servlet是线程安全的吗?
从上面Servlet的调用过程可以看出,当客户端第一次请求Servle