servlet线程模型

   servlet在Javaweb的开发中是必不可少,尽管有SSM这些优秀的框架,尤其是SpringMVC解放了我们写大量的servlet,但是核心原理是基于servlet,DispatchServlet,就是一个servlet,它会拦截所有请求,然后分发。回到正题,servlet在tomcat容器内是怎么样的存在,是当每一次请求,web容器就重新初始化一个servlet实例,还是只存在一个servlet实例,其实在tomcat容器中,servlet的线程模型是单例多线程,就是存在一个实例,每当有一个请求,都会分发一个线程就执行一个servlet实例相应的方法:比如post,get等。这里的线程是重用的,tomcat的容器使用了线程池。我写了一个程序,简单的说明了这一点:  

import java.io.*;
import java.net.Socket;

/**
 * Created by Jackie on 2017/9/20.
 */
public class SocketSender {

    private static final String REQUES_CONTENT = "GET / HTTP/1.1\r\n" +
            "Host: localhost:8080\r\n\r\n"
           ;


    public static void main(String[] args){
        for (int i = 0 ; i < 10 ; i++){
            Socket socket;
            try {
                socket = new Socket("localhost", 8080);
                OutputStream outputStream = socket.getOutputStream();
                BufferedOutputStream out = new BufferedOutputStream(outputStream);
                out.write(REQUES_CONTENT.getBytes());
                out.flush();

                BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String line;
                while ((line = bf.readLine()) != null&&!line.isEmpty()){
                    System.out.println(line);
                }

                out.close();
                bf.close();

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

package online.fengshan;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by Jackie on 2017/9/20.
 *
 */
public class ServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(Thread.currentThread());
    }

}

  一个是servlet,另外一个程序就是使用socket发起10个http请求,在servlet中打印执行get方法的当前线程。我们来看看运行结果:

  这是在tomcat控制台中打印的信息,可以看到请求是由不同的线程执行的,但是有些请求是由一个线程执行的,因为使用了线程池,线程可重用。

  既然知道了servlet是单例多线程,那么我们平时写程序要注意什么,因为是单例,所以全局变量在多线程下是线程不安全的,所以有些不能被线程共享的变量尽量不要写在全局中,局部变量可以避免这点,局部变量是线程独有的,在虚拟机栈中为线程独有,不明白的可以去看看JVM内存模型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值