1

セッションにオブジェクトを保存しています。私のコントローラーでは、ユーザーがリクエストを送信すると、同時に次のコードが実行されます。

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ループ内のオブジェクトはまだnull化されていません.

実現

この種の混乱に陥る人にとって、私の問題の根本は、Java でオブジェクトがどのように渡されるか混乱していることです。私の問題は単純で、オブジェクト自体はなく null への参照obj = null設定するだけです。obj

モルガノが指摘したように、セッション内のオブジェクトは、while ループを実行するスレッドによってローカルに参照されているため、オブジェクトが null になることはreq.getSession().setAttribute("myObject", null);ありreq.getSession().removeAttribute("myObject");ません。これらは基本的に、セッションからオブジェクトへの参照を削除するだけです (したがって、理想的には gc の候補にします。これは、オブジェクトが長時間実行されている http 要求によってローカルで参照されるため、私の状況では発生しません [while ループのこと]) .

4

3 に答える 3

3

それをしないで、これをしてください:

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

またははるかに良い:

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

あなたがしていることは、オブジェクトへの参照をnullに設定しているため、セッション属性をまったく変更していません。

質問の編集後の更新:

「反復」スレッドがオブジェクトへの参照を取得すると、「削除」スレッドがそれをセッションから削除しても無駄です。オブジェクトは最初のスレッドのローカル変数によって参照されています。

于 2013-07-23T03:14:39.093 に答える
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

つまり、参照される値を null (つまり、例のセッション)に設定する代わりに、実際には参照自体を null に設定しています (つまりobj、例では)。

于 2013-07-23T03:17:51.360 に答える
0

このようなことをしてください。セッションはキー値マップです。特定のキー値に対して明示的に null を設定する必要があります。

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

またはキーをまったく削除します。

req.getSession().removeAttribute("myObject");
于 2013-07-23T03:15:26.353 に答える