我有两个JSP文件,每个文件都由不同的PC访问。
在第一个中,我正在创建一个Integer
类型的对象:
Integer var = 0;
application.setAttribute("name_var", var);
在第二个,我得到之前创建的属性:
var = (Integer) application.getAttribute("name_var");
此时一切都很好。我在第二个JSP中,在不同的PC中具有我的价值。
由于Java是按值传递的,其中值是引用(Is Java "pass-by-reference" or "pass-by-value"?),我想我在两个JSP文件中都有相同的实例(由不同的PC访问)。
所以现在,当我修改我的var值,并且它在另一侧没有出现修改时,我不明白为什么。
var++;
Output (in the JSP where the attribute was set): 0 (still)
任何人都可以解释我发生了什么吗?每次修改其值时,是否要用setAttribute
更新对象?
提前谢谢
答案 0 :(得分:1)
您需要将更改后的值设置回应用程序属性,而不仅仅是var++
:
application.setAttribute("name_var", ++var);
原因是Integer
对象的自动装箱和不变性。当您说var++
时,java会将Integer
解包为原始int
并将其递增。但结果不属于该属性。
答案 1 :(得分:1)
var++
不会更改应用程序中存储的Integer实例的内部状态。整数是不可变的。它的状态永远不变。
该操作相当于
int tmp = var.intValue();
tmp = tmp + 1;
var = Integer.valueOf(i);
所以var
现在引用另一个Integer实例,而不是存储在应用程序中的实例。
另一种方法是再次将新值存储在应用程序中,或者在应用程序中存储一个线程安全的可变值:
AtomicInteger var = new AtomicInteger(0);
application.setAttribute("name_var", var);
...
var.incrementAndGet();