Servlet默认情况下是单实例多线程的,编程的过程中需要程序员处理可能出现的线程安全问题。
-
默认情况下,Servlet容器对每个Servlet只实例化一次。Servlet容器维护一个线程池服务请求,当容器收到一个访问Servlet的请求时,就会从线程池中选一个线程,把请求传递给这个线程,由这个线程调度Servlet的方法。
-
所以在默认情况下,Servlet是多线程的,一个Servlet实例同时在多个线程中执行,并发地处理多个客户端请求。因为Servlet是多线程的,所以开发Servlet时必须注意线程安全。Servlet线程的安全有两个问题,一个是变量的线程安全,局部变量总是线程安全的,实例变量和类变量不是线程安全的。另一个是属性的线程安全,请求对象的属性访问是线程安全的,而session对象和上下文的属性访问不是线程安全的。
-
推荐:
尽可能在Servlet中使用局部变量;
应该使用只读的实例变量和静态变量;
不要在Servlet中创建自己的线程;
修改共享对象时一定要同步,尽可能地缩小同步代码块,在方法上进行同步会影响性能;
如果多个不同的Servlet对外部对象进行修改操作一定要加锁,做到互斥访问。