2013-07-23 26 views
1

我有一個存儲在會話中的對象。在我的控制器,當用戶發送請求時,它同時執行以下代碼:儘管明確地將其設置爲空,但會話attrribute的引用不會爲null

正如我指出的,它同時執行,因此而控制研究仍是在循環中,用戶可以做一些其他的事情如,當用戶按下另一個按鈕,請求將被髮送到控制器,所述控制器執行以下操作:

MyObject obj = (MyObject) req.getSession().getAttribute("myObject"); 
obj = null; 

我的期望是,該循環,直到一個新的結果是可用的將拋出NullPointerException代碼。只有找到我們的不是。

那麼,爲什麼物體從另一個控制器的會話拉不null儘管對象設置爲另一個控制器null

編輯:

在我當前的代碼,其實我試着做

req.getSession().setAttribute("myObject", null);

req.getSession().removeAttribute("myObject");

不過,這並沒有解決我的問題, while循環中的對象仍然沒有消失。

實現

對於那些誰就會得到這樣的困惑,我的問題的根源是我弄糊塗了對象是如何在Java中通過。我的問題很簡單,obj = null只是將參考obj設置爲空,並且不是對象本身。

正如morgano指出的那樣,會話中的對象由執行while循環的線程在本地引用,所以req.getSession().setAttribute("myObject", null);req.getSession().removeAttribute("myObject");不會導致對象變爲空值。這些只是基本上從會話中刪除對象的引用(因此最好使它成爲gc的候選對象,在我的情況下不會發生這種情況,因爲對象被長時間運行的http請求[while循環事件]本地引用)。 。

+0

你可以發佈一些你的併發控制器代碼。 –

+0

可以請downvoters解釋爲什麼downvote? – Bnrdo

回答

3

不要這樣做,這樣做:

req.getSession().setAttribute("myObject", null); 

或好得多:

req.getSession().removeAttribute("myObject"); 

你正在做的是設置爲null以一個對象的引用,你是不是修改會話屬性。

UPDATE QUESTION版AFTER:

一旦「迭代」線程擁有對對象的引用,這是徒勞的「刪除」線程將其從會話中刪除,你的對象已經由本地引用在第一個線程中變量。

0

做這樣的事情。會話是一個關鍵的價值地圖。您必須針對特定鍵值顯式設置空值。

req.getSession().setAttribute("myObject", null); 

或者刪除密鑰。

req.getSession().removeAttribute("myObject"); 
+0

我做到了,仍然是,對象沒有被清空 – Bnrdo

1

考慮這個例子:

MyObject a = new MyObject(); 
MyObject b = a; 
b = null; 

你彷彿在期待是:

MyObject a = new MyObject(); // a is the new object 
MyObject b = a; // b is the same object 
b = null; // set the object referenced by both a and b to null 

真正發生:

MyObject a = new MyObject(); // a is the new object 
MyObject b = a; // b points to the same object as a 
b = null; // b doesn't point to anything 

因此,在短期:不是設置參考值爲空(即在你的例子中的會話),你實際上將引用本身設置爲空(即在你的示例中爲obj)。

+0

我的問題是在Java中。你能用Java語境更新答案嗎? – Bnrdo

+0

完成。除了MyObject位之外,它本質上是相同的。 – nathanchere