Why do variables not retain their values in Servlets in spite of being shared during multithreading
本问题已经有最佳答案,请猛点这里访问。
我有一个简单的JSP页面,它有一个取参数
1 2 3 4 | <form action="test"> Insert Value<input type="text" name="val"/> <input type="submit"/> </form> |
接下来我有一个servlet
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实例,因此一次只能创建一个可保存一个值的变量
除了只有一个servlet实例之外,每个HTTP请求都在一个线程内执行,因此每个doget的执行都有自己的调用堆栈。以下命令在该堆栈上创建局部变量:
1 |
因此,对于每个线程都有一个调用堆栈,所以每个线程都有它自己的变量版本。
现在你已经纠正了代码。对于每个请求,您都在更新将由最新请求更新的val属性值:
1 |
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 |
你的方法是:
1 2 3 | public void doStuff(HttpRequest request){ ... } |
每个调用都有一个唯一的请求作为参数,因此是一个唯一的"val"参数。