2015-03-13 45 views
1

我有兩個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更新對象?

預先感謝您

回答

1

var++不會更改存儲在應用程序中的Integer實例的內部狀態。整數是不可變的。其狀態從未改變。

的操作相當於

int tmp = var.intValue(); 
tmp = tmp + 1; 
var = Integer.valueOf(i); 

所以var現在引用另一個整數例如比存儲在應用程序中的一個。

另一種方法是再次存儲在應用程序中的新的價值,或者存儲在應用程序中的線程安全的,可變的值:

AtomicInteger var = new AtomicInteger(0); 
application.setAttribute("name_var", var); 
... 
var.incrementAndGet(); 
+0

感謝您的解釋,並且爲AtomicInteger類。這將是非常有用的=) – 2015-03-13 18:18:06

1

而不是僅僅var++,你需要設置改變的值返回給應用程序屬性:

application.setAttribute("name_var", ++var); 

原因是自動裝箱和Integer對象的不變性。當你說var++時,java將Integer打包到一個原始的int中,然後遞增。但結果並沒有涉及到這個屬性。

+0

奇怪的事情發生在這裏。 – 2015-03-13 18:09:17

+0

不開玩笑 - 爲什麼它表明我回答了兩次? – gknicker 2015-03-13 18:10:20

+2

@gknicker StackOverflow可能在應用程序中存儲了整數的答案數,並認爲增加它會改變應用程序的屬性:) – 2015-03-13 18:12:23