2016-06-24 5 views
0

Ich habe ein Java-Servlet, das einen wiederholten Code hat Ich würde es in eine Methode ausstellen, um den Code zu reinigen.Servlet, die Probleme mit Nebenläufigkeit bei der Methode haben könnte?

Das Problem ist, ich habe gelesen, dass Nebenläufigkeit Probleme sein könnten, wenn ich Hilfsmethoden verwenden.

Stimmt das?

Dies ist mein Code, der mehrmals wiederholt wird:

if(session.getAttribute("attemps") == null) { 
    session.setAttribute("attemps", 1); 
} 
else { 
    Integer attemps = (Integer) session.getAttribute("attemps"); 
    session.setAttribute("attemps", attemps + 1); 
} 

ich eine Methode mit diesem Code innerhalb schaffen würde und dann die Methode aufrufen, wenn nötig.

Danke.

+0

Ist Nebenläufigkeit wird in derselben Sitzung passieren? Oder sprichst du davon, dass Servlet von mehreren Anfragen angerufen wird? –

+0

Ich sprach über das Servlet, das von mehreren Anfragen aufgerufen wird. Das ist meine Hauptbeschäftigung, aber, wenn Sie die Lösung für beide haben ... Ich werde mich freuen :) – Ommadawn

+1

Für Servlet, das von mehreren Anfragen aufgerufen wird, wird jede Sitzung ihre eigenen Attribute haben und die Konsolidierung des Codes sollte in Ordnung sein. Es sei denn, in jeder Anfrage machen Sie etwas Multithreading. Wenn Sie sich Gedanken über die Gleichzeitigkeit mit der gleichen Anfrage machen, schlage ich vor, dass Sie die Synchronized-Methoden lesen und nur einem Thread erlauben, auf die Methode gleichzeitig zuzugreifen. –

Antwort

1

Concurrency-Probleme treten nicht auf, wenn Sie Code in eine separate Methode extrahieren. Concurrency-Probleme treten auf, wenn mehrere gleichzeitige Threads auf den veränderbaren Status zugreifen.

Sie haben hier einen veränderlichen Zustand: die Sitzung. Zwei Anfragen, die von demselben Browser kommen, können gleichzeitig behandelt werden, und dies kann zu einer Wettlaufsituation führen. Die Sitzung selbst ist Thread-sicher, aber da Sie check-then-act- und get-tose-set-Aktionen für die Sitzung ausführen, obwohl die Sitzung sicher ist, könnten Sie am Ende ein falsches Ergebnis erhalten.

Zum Beispiel können zwei Threads gleichzeitig könnte für null überprüfen, könnte gleichzeitig sehen die Versuche als null-Attribut, und konnte sowohl seinen Wert auf 1. Sie würde also mit 1 Versuch am Ende statt 2.

+0

Danke, @JBNizet! Sie denken also, ist eine gute Idee, den Inhalt meiner Methode zu wickeln und so etwas wie syncronized (lock) { // mein Inhalt } – Ommadawn

+0

Wenn die Methode in einem Servlet ist, die ein Singleton ist, dann ja. Ich würde jedoch lieber ein spezielles fstatic final lock verwenden. Beachten Sie, dass beide Strategien andere Threads aus anderen Sitzungen blockieren, die ausgeführt werden. Wahrscheinlich kein Bug-Deal. –