Servlet单实例多线程及注意事项。
1.Servlet是单实例多线程的,具体是怎么实施这个过程的可以百度,前辈们已经很具体详细的写明白了。
2.Servlet的单实例指的是这个servlet类只被实例化一次,就是第一次请求这个servlet的时候
3.Servlet怎么处理一个请求:
①你编写了一个servlet类
②请求到了,需要servlet去处理,这个时候被类被实例化一次(成员变量在堆中开辟内存,临时变量在栈中开辟内存),得到了一个servlet实例,它的处理业务的关键性代码和你写的一样。
③开始处理请求:先把刚才实例化的servlet的临时变量,成员变量复制一份,开始一个处理这个请求的线程。
4.Servlet的多线程:
1)先接着3,④:当第二个请求到了,这个时候不在重新实例化一个servlet,而是复制一份那个实例化的servlet的临时变量和成员变量,开启一个新的线程,这个新线程开始处理新请求。
2)多线程,就是多个请求到了,servlet不会重新实例化,只有一个servlet的实例化对象。但是会有一个对应的新线程开启,线程复制一份servlet实例对象的成员变量和临时变量,紧接着开始自己的事务处理。
5.所以写servlet的时候要十分注意成员变量的使用,它是在堆中的,所以你所有请求来的时候,开启新线程,每个线程复制过去的成员变量是共享的东西,这个共享就会因为读取修改在时间上的交错而产生线程问题,而那些方法内的临时变量是不会这样,因为它们在栈中,当超过了作用域(比如你这个变量是在一个方法里的,你执行完这个方法,它就销毁了,另一个线程去复制时,等于说重头开始。)就失效了。
关于堆和栈请参考看下:(权倾删)http://blog.csdn.net/huozhicheng/article/details/6575960