servlet的自动加载
默认情况下,当第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或者init的方法中执行了比较多的逻辑代码,那么会导致第一次访问servlet的时候比较慢。
这时侯我们只需要改变servlet创建的时机,提前到加载web应用的时候。只需要在servlet配置信息中,加上<load-on-startup>即可。<load-on-startup>标签中的值是整数的,多个<load-on-startup>标签,数字越大,优先级越低。

servlet的并发问题
因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享资源,比如说:成员变量,就会引发servlet的安全问题。下面将举例说明:
线程1执行,紧接着线程2执行,线程1还没执行count++,就会出现线程问题了。
public class ThreadServlet extends HttpServlet {
int count = 1;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("你现在是第"+count+"个访客");
count++;
}
}

这时候只需要把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)。建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。
代码展示如下:
int count = 1;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
synchronized (ThreadServlet.class){//锁对象必须是唯一的
response.getWriter().write("你现在是第"+count+"个访客");
count++;}
}
运行效果:

网友评论
你这种做法不好,应该只synchronize当前这个对象就行了。按你的做法,如果其它的servlet也synchronize了ThreafServlet.class,就会造成不必要的阻塞
线程1执行,紧接着线程2执行,线程1还没执行count++,就会出现线程问题了。
这一块没有贴代码啊