Servlet对象,在第一次被访问的时候被创建,或者是配置了随应用启动便初始化的Servlet,可见,Servlet是单例的。
为了应对并发的对同一个servlet的请求,Tomcat内部维护了一个线程池,调度线程,来Servlet进行访问。
在何种情况下,会发生线程安全问题呢?
在Servlet里定义了一个属性message,每个线程都公用这一个message。
public clss ThreadSafeServlet extends GenericServlet{
String message = null;
void service(){
message = request.getParameter("msg");
System.out.println(message);
}
}
其实,就演变成了下面的演示代码。想必也是能看出来,其中的线程问题。
ThreadSafeServlet servlet = new ThreadSafeServlet();
class TheadObj implements Runnable{
run(){
servlet.service();
}
}
public void dispatcher(){
Runnable r1 = new ThreadObj();
Runnable rw = new ThreadObj();
Thread thread1 = new Thread(r1);
Thread thread2 = new Thread(r2);
thread1.start();
thread2.start();
}
避免线程安全问题,就不用定义这种全局的公用的属性。将属性定义到方法内。
方法内定义的变量,每个线程是否都是“备份”了一份呢?