一 Servlet容器的请求处理方式?

Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时,但却带来了线程安全问题.

对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目

二 Servlet容器如何同时来处理多个请求?

   先看几个概念:

          工作者线程Work Thread:执行代码的一组线程
           调度线程Dispatcher Thread:每个线程都具有分配给它的线程优先级,线程是根据优先级调度执行的.


           Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程.
         当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的 service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请 求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线 程中并发执行。  

三 如何解决线程安全问题?

 有几个原则:

1 尽量使用局部变量.局部变量是不被共享的;

2 使用同步块Synchronized,但不要在SERVICE方法和响应方法中使用,会严重影响性能;

3 把处理功能尽量不要放在SERVICE中,放在外部函数中,可以同步处理;

4 关于接口SingleThreadModel在SERVLET2.4中已废弃.

5 使用同步的集合类:
  使用Vector代替ArrayList,使用Hashtable代替HashMap。

 

以上也是参考了许多网上资料.