1、当多个客户端并发访问服务器时,服务器都会为么一个客户端开启一个线程去调研servlet的service 方法。如果访问的是同一个资源的话,就可能引发线程安全问题。
处理方式, 有两种:一般使用第一种
第一种:使用 synchronized (this) ,之锁住必要的代码,不然效率会很低
public class HelloWorld extends HttpServlet {
String name ;
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
synchronized (this) { //使用同步代码库,保证同一时间只有一个线程执行该段代码,效率太低
name = request.getParameter("name"); // 从request中读取name参数
try {
Thread.sleep(3000); // 为突出效果,让线程沉睡5秒钟
} catch (InterruptedException e) {}
response.getWriter().println("hello: " + name);
}
}
}
第二种方法: SingleThreadModel 标记接口,但是该接口已经在 servlet 2.4 被废弃了。不推荐使用。原理,每次访问都都重新创建一个servlet.
public class HelloWorld extends HttpServlet implements SingleThreadModel {
String name;
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
name = request.getParameter("name"); // 从request中读取name参数
try {
Thread.sleep(3000); // 为突出效果,让线程沉睡5秒钟
} catch (InterruptedException e) {}
response.getWriter().println("hello: " + name + ". SingleThreadModel ");
}
}