Hallo,
ich habe folgende 2 Codefragmente, die von unterschiedlichen Servlets und damiaufgerufen werden:
Code A:
und
Code B:
Ich will innerhalb des synchronized-Blocks von Code A in jedem Fall (!) garantiert haben, dass die Session gültig ist und als Mutex dient (also keine IllegalStateException-Exception geworfen wird).
Nun wäre jedoch (erst einmal rein fiktiv) folgendes Aufrufschema denkbar:
Thread 1 (führt Code A aus): HttpSession session = request.getSession(true);
Thread 2 (führt Code B aus): führt den gesamten Code B aus
Thread 1: führt in Code A den Block
aus
Und voila - plötzlich ist es nicht mehr garantiert, dass die Session innerhalb des synchronized-Blocks von Code A gültig ist.
Nun folgende Fragen:
- Kann das Szenario wirklich so eintreten?
- Wie kann ich dann durch welche Codeänderungen garantieren, dass ich im synchronized-Block von Code tatsächlich eine gültige Session vorliegen habe:
* ein Abfangen von IllegalStateException und falls diese auftrat, es nochmal komplett neu probieren, betrachte ich nur als ultimative Notlösung, da ich dies sehr unelegant finde
* dito im synchronized-Block von Code A noch ein request.getSession(false); aufrufen und wenn ich dann null bekomme, es nochmal komplett neu probieren
Danke im Voraus
wolfgke
ich habe folgende 2 Codefragmente, die von unterschiedlichen Servlets und damiaufgerufen werden:
Code A:
Java:
HttpSession session = request.getSession(true);
synchronized (session) {
// mit der Session ein paar Dinge tun
}
und
Code B:
Java:
HttpSession session = request.getSession(false);
if (session != null) {
synchronized (session) {
session.invalidate();
}
}
Ich will innerhalb des synchronized-Blocks von Code A in jedem Fall (!) garantiert haben, dass die Session gültig ist und als Mutex dient (also keine IllegalStateException-Exception geworfen wird).
Nun wäre jedoch (erst einmal rein fiktiv) folgendes Aufrufschema denkbar:
Thread 1 (führt Code A aus): HttpSession session = request.getSession(true);
Thread 2 (führt Code B aus): führt den gesamten Code B aus
Thread 1: führt in Code A den Block
Java:
synchronized (session) {
// mit der Session ein paar Dinge tun
}
Und voila - plötzlich ist es nicht mehr garantiert, dass die Session innerhalb des synchronized-Blocks von Code A gültig ist.
Nun folgende Fragen:
- Kann das Szenario wirklich so eintreten?
- Wie kann ich dann durch welche Codeänderungen garantieren, dass ich im synchronized-Block von Code tatsächlich eine gültige Session vorliegen habe:
* ein Abfangen von IllegalStateException und falls diese auftrat, es nochmal komplett neu probieren, betrachte ich nur als ultimative Notlösung, da ich dies sehr unelegant finde
* dito im synchronized-Block von Code A noch ein request.getSession(false); aufrufen und wenn ich dann null bekomme, es nochmal komplett neu probieren
Danke im Voraus
wolfgke