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

Why do variables not retain their values in Servlets in spite of being shared during multithreading

本问题已经有最佳答案,请猛点这里访问。

我有一个简单的JSP页面,它有一个取参数val值的表单。

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

接下来我有一个servlet test.java,它接受val并打印它。servlets doGet方法如下-

1
2
3
4
        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值?EDOCX1[0]的值是否应该在多个请求之间共享,并反映其在相应请求中的变化?请帮忙。谢谢。


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

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

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


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

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

So, if you want to retain the value ensure you are increasing the
scope of this variable to class, make it volatile and then while assigning you are verifying if it has any existing value in it.


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

假设VAL为:

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

你的方法是:

1
2
3
public void doStuff(HttpRequest request){
   ...
}

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