Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每个tomcat服务器是否只有一个servlet对象?_Java_Tomcat_Servlets - Fatal编程技术网

Java 每个tomcat服务器是否只有一个servlet对象?

Java 每个tomcat服务器是否只有一个servlet对象?,java,tomcat,servlets,Java,Tomcat,Servlets,我做了一个简单的测试,并从不同的浏览器和命令行工具执行了下面的测试servlet。无论我在哪里执行,它都显示相同的“HoHoHoHo时间”。我完全同意,我只想知道两件事: a) 如果我可以依赖不同版本的tomcat(今天我使用的是7.54版) b) 这是否意味着servlet永远不会在不同的线程中并行执行(即,两个用户同时请求同一个servlet) 实际上,servlet容器只创建每个servlet的一个实例。这有助于在servlet成员变量中保存状态。然而,这并不意味着servlet容器不能使

我做了一个简单的测试,并从不同的浏览器和命令行工具执行了下面的测试servlet。无论我在哪里执行,它都显示相同的“HoHoHoHo时间”。我完全同意,我只想知道两件事:

a) 如果我可以依赖不同版本的tomcat(今天我使用的是7.54版)

b) 这是否意味着servlet永远不会在不同的线程中并行执行(即,两个用户同时请求同一个servlet)


实际上,servlet容器只创建每个servlet的一个实例。这有助于在servlet成员变量中保存状态。然而,这并不意味着servlet容器不能使用同一个servlet实例同时处理服务器请求。这就是servlet所包含(包括Tomcat)的功能。因此,servlet必须是线程安全的。有关详细信息,请参阅本文:

每个HttpServlet只有一个实例,构造HttpServlet时只调用一次其init()方法。但是,对于每个请求,doGet()在不同的线程中被调用,并且可以并行执行。

我对您的问题有以下看法

a)是的,至少从tomcat 7开始。对于tomcat 6(
注释支持
),您必须检查规格

b)关于并行线程中的执行,默认情况下servlet不是线程安全的,为了确保线程安全,servlet service()方法不应该访问任何成员变量,除非这些成员变量本身是线程安全的

有关线程安全的更多信息:

@WebServlet(name="test servlet 2", urlPatterns={"/test2"}, loadOnStartup=1)
public class Test2 extends HttpServlet {
    private String test = "baaa .. :-(";

    @Override
    public void init(ServletConfig config) throws ServletException {
        DEBUG("Server starts");
        this.test = "hohoho " + System.currentTimeMillis();
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletOutputStream out = resp.getOutputStream();

        out.write(test.getBytes());

        out.flush();
        out.close();
    }
}