Servlet的线程安全问题,多个客户端访问Servlet时,Servlet就会创建一个线程,并调用service方法,因此service方法在同时访问一个资源的时候,就会出现安全问题。
SingleThreadModel接口已经过时,实现SingleThreadModel接口,客户端访问Servlet时就会创建一个Servlet对象
解决Servlet线程安全问题,需要用到线程同步解决。代码如下:
privateintcount=0;
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
synchronized (this) {
count++;
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
response.getWriter().print(count);
}
}
如果不用线程的同步就会出现相同的数据,造成资源的安全问题;
这里的Thread.sleep(1000);不能向外面抛出异常,只能处;
由于利用线程同步,就加锁了,在客户端访问资源的时候,请求的时间相对长,是因为下一个客户必须等上一个客户释放了锁,才能访问资源;
这就解决了Servlet的线程安全问题。
ServletConfig对象
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。