首页 文章

尽管在多线程期间共享变量,为什么变量不会在Servlet中保留它们的值[重复]

提问于
浏览
-2

这个问题在这里已有答案:

我有一个简单的JSP页面,其表单的值为参数 val

<form action="test">
Insert Value<input type="text" name="val"/>
<input type="submit"/>
</form>

接下来我有一个servlet test.java ,需要 val 并打印出来 . servlets doGet 方法看起来像这样 -

String val=request.getParameter("val");
        response.setContentType("text/html");
        PrintWriter p=response.getWriter();
        p.println("Value of parameter is "+val);

现在,我已经读过在初始化期间只创建了一个servlet实例,即只创建了一个servlet对象,并使用Multiple Threads处理了多个请求 .

现在,由于只创建了一个servlet实例,因此只创建了一个变量 val 的实例,它一次只能保存一个值,那为什么在多个请求期间每个用户都可以访问自己的 val 值?
不应该在多个请求之间共享 val 的值并反映其在相应请求中的更改?
请帮忙 . 谢谢 .

3 回答

  • 0

    除了只有一个servlet实例之外,每个HTTP请求都在一个线程内执行,因此每次执行doGet都有自己的调用堆栈 . 以下命令在该堆栈上创建一个局部变量:

    String a=request.getParameter("val");
    

    因此,对于每个线程都有一个调用堆栈,因此每个线程都有自己的此变量版本 .

  • 0

    我不确定你的代码:val没有定义?你在哪里运行这些代码行?

    假设val是:

    String val=request.getParameter("val");
    

    而且你的方法如下:

    public void doStuff(HttpRequest request){
       ...
    }
    

    每个调用都有一个唯一的请求作为参数,因此唯一的“val”参数 .

  • 1

    所以现在你已经纠正了代码 . 对于每个请求,您正在更新val属性的值,该属性将由最新请求更新:

    String val = request.getParameter("val");
    

    因此,如果要保留该值,请确保将此变量的范围增加到类,使其变为volatile,然后在分配时验证它是否具有任何现有值 .

相关问题