【发布时间】:2013-07-23 12:04:50
【问题描述】:
我有一个对象存储在会话中。在我的控制器中,当用户发送请求时,它同时执行以下代码:
MyObject obj = (MyObject) req.getSession().getAttribute("myObject");
while(!obj.isNewResultAvailable()){
//will loop until new result is available.
}
正如我所指出的,它是并发执行的,因此当控件仍在循环中时,用户可以做一些其他事情,例如,当用户按下另一个按钮时,将向执行以下操作的控制器发送请求以下:
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 的 reference 设置为 null 而 NOT 对象本身。
正如 morgano 所指出的,会话中的对象已被执行 while 循环的线程本地引用,因此,req.getSession().setAttribute("myObject", null); 和 req.getSession().removeAttribute("myObject"); 不会导致对象为空。这些只是基本上从会话中删除对对象的引用(因此理想情况下使其成为 gc 的候选者,这在我的情况下不会发生,因为该对象是由长时间运行的 http 请求本地引用的 [the while loop thing]) .
【问题讨论】:
-
你能发布一些你的并发控制器代码吗?
-
能否请投反对票的人解释为什么投反对票?
标签: java httpsession