一、Servlet的自动加载:
1、存在问题:默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么就会导致用户第一次访问sevrlet的时候比较慢。
2、解决方案改变servlet创建对象的时机: 提前到加载web应用的时候!
3、操作在servlet的配置信息中,加上一个<load-on-startup>
即可!
4、代码举例:
1)web.xml中修改的代码:
<servlet>
<servlet-name>ServletLife</servlet-name>
<servlet-class>sram.life.ServletLife</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletLife</servlet-name>
<url-pattern>/ServletLife</url-pattern>
</servlet-mapping>
2)Servlet代码:
5、注意事项:
1)如果存在多个需要自动加载的Servlet,<on-load-startup>整数值</on-load-startup>
中整数值越大,创建优先级越低!
2)如果多个Servlet的整数值相同,则按照web.xml中代码的顺序加载!
二、对比有参的init方法和无参的init方法
1、Servlet接口中的方法:
2、GenericServlet类中的方法:
3、对比源码:
4、对比:
1)init(ServletConfig config)方法:
2)init()方法:
三、Servlet的多线程并发问题:
1、注意: servlet对象在tomcat服务器是单实例多线程的。
2、问题:因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。
3、解决办法:
package sram.thread;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletThread extends HttpServlet {
int count = 1;
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
synchronized (ServletThread.class) {//锁对象必须唯一。建议使用类对象
response.getWriter().write("您是第"+count+"个访客");
count++;
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)
2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!),以避免因为同步而导致并发效率降低。