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

时间:2016-06-28 15:31:17

标签: java multithreading jsp servlets

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

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


接下来我有一个servlet test.java,它接受​​val并打印它。 servlet doGet方法看起来像这样 -

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


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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

假设val是:

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

你的方法如下:

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

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

答案 2 :(得分:0)

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

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

因此,如果您想保留该值,请确保您增加   此变量的范围为class,将其设置为 volatile ,然后在分配时验证其中是否包含任何现有值。