Servlet的自动加载、对比有参的init方法和无参的init方法、Servlet的多线程并发问题

本文详细探讨了Servlet的自动加载机制,如何通过修改web.xml提前创建Servlet对象以提升用户体验。接着对比了有参和无参init方法的区别,并分析了Servlet在多线程并发情况下的线程安全问题,提出了同步代码块和避免使用成员变量的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!),以避免因为同步而导致并发效率降低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值