Wie stelle ich sicher, dass meine Java-Servlets-Webanwendung Thread-sicher ist? Was muss ich in Bezug auf Sitzungsvariablen, statische Variablen einer Klasse oder irgendetwas anderes, das ein Thread-Sicherheitsproblem sein könnte, tun?In Java, Wie stelle ich sicher, dass meine Webanwendung threadsicher ist?
Antwort
Fact verwenden: Es gibt nur 1 Instanz eines Servlets in Webapp ist Lebenszeit. Es wird beim Start von WebApp erstellt und beim Herunterfahren der WebApp zerstört. Siehe auch this answer für eine grobe Interpretation.
So wurde es unter allen Anfragen (Threads) geteilt. Wenn Sie Anfrage- oder Sitzungsbereichsdaten als Instanzvariablen (oder schlimmer noch, als static
) Variablen zuweisen, ist dies definitiv kein Threadsicher, da sie dann unter allen Anfragen (Threads) von allen Benutzern (Sitzungen) anwendungsweit geteilt werden. Sie müssen sie nur als lokale Methodenvariablen zuweisen, damit sie sicher bleiben. Also:
public class MyServlet extends HttpServlet {
private Object thisIsNOTThreadSafe;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object thisIsThreadSafe;
thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
}
}
Das ist im Grunde alles, was Sie berücksichtigen müssen, wenn Sie Servlets mit Threadsicherheit im Auge behalten.
Dann gibt es Sitzungsattribute (HttpSession
), die unter mehreren Anfragen desselben Benutzers gemeinsam genutzt werden können, aber in der realen Welt müssen Sie sich keine Gedanken über die Synchronisierung des Sitzungszugriffs machen. In der Regel werden dort nur benutzerspezifische Daten wie der eingeloggte Benutzer, benutzerspezifische Einstellungen, der Warenkorb usw. hinterlegt. Sie müssen lediglich sicherstellen, dass Sie keine reinen Anforderungsbereichsdaten in den Sitzungsumfang eingeben. Es würde sich in mehreren Browserfenstern/Tabs innerhalb derselben Sitzung widerspiegeln.
Dann gibt es Anwendung (ServletContext
) Attribute, die unter allen Benutzern Applicationwide freigegeben sind, aber Sie normalerweise nur Konstanten und andere statische Daten dort, wie die Webapp-Konfiguration, DAO Factory, Drop-down-Liste Inhalte und so weiter.Dies alles kann übrigens mit einem gemacht werden, siehe auch this answer für ein grundlegendes Beispiel. Sie müssen lediglich sicherstellen, dass Sie keine reinen Anforderungs- oder Sitzungsdaten im Anwendungsbereich der Anwendung angeben.
Meinst du in einem Kontext im Gegensatz zu anderen Java-Anwendungen? Es gibt wirklich keinen großen Unterschied. Jede Anfrage an ein Servlet bewirkt, dass der Container einen neuen Thread ausgibt, um damit umzugehen. Daher müssen Instanzvariablen innerhalb des Servlets Thread-sicher sein. Es ist besser, all Ihr Geschäft mit lokalen Variablen in den Methoden doGet/doPost() zu behandeln. Es gibt einen Fehler, den ich mir vorstellen kann. Bei Sitzungsvariablen kann es sein, dass der Benutzer zwei Browserfenster geöffnet hat, die beide auf Ihre Anwendung verweisen. In diesem Fall müssten Sie auch mit dem Sitzungsumfang auf Thread-Sicherheit achten.
Wow, das ist eine geladene Frage.
Um es einfach auszudrücken, müssen Sie sicherstellen, dass der Zugriff auf freigegebene Daten sorgfältig synchronisiert wird. Z. B. können Sie den Zugriff auf eine statische Variable mit einem Mutex oder einer synchronisierten Funktion synchronisieren.
Beachten Sie, dass Sie möglicherweise auch auf höheren Ebenen synchronisieren müssen, wenn Sie atomare Transaktionen benötigen, die mehrere gemeinsam genutzte Ressourcen gleichzeitig ändern.
Entwerfen einer gleichzeitigen Anwendung ist nicht einfach, und es gibt kein Wundermittel (leider). Ich empfehle das Buch "Java Concurrency in Practice" für weitere Informationen zum Schreiben von Sicherheitscode.
- keine Instanzvariablen von Servlets und Filter
- nicht verwenden statische Variablen
- read this article on session thread safety
- denken
- 1. Wie stelle ich eine Java-Webanwendung bereit?
- 2. Wie stelle ich sicher, dass der Anruf asynchron ist?
- 3. QNetworkAccessManager: Wie stelle ich sicher, dass der Download abgeschlossen ist?
- 4. Wie stelle ich sicher, dass meine Ansicht nach Vollbildvideo korrekt ausgerichtet ist?
- 5. Wie stelle ich sicher, dass Whitespace in Markdown erhalten bleibt?
- 6. Wie stelle ich sicher, dass Anfragen von meiner Website stammen?
- 7. Wie stelle ich sicher, dass Monit beim Systemstart gestartet wird?
- 8. Wie stelle ich sicher, dass mein Git Repo Code sicher ist?
- 9. Wie stelle ich sicher, dass Tomcat6 CATALINA_OPTS unter Windows liest?
- 10. Wie stelle ich sicher, dass meine Controller- und Modellspezifikationen mit rspec und rails übereinstimmen?
- 11. Wie stelle ich sicher, dass meine Android-App auf allen Android-Handys gleich aussieht?
- 12. Wie stelle ich sicher, dass nur Regionen-Monitoring-fähige Geräte meine App im Store sehen können?
- 13. Wie stelle ich sicher, dass meine Website Automatisierungsskripte, Bots blockieren kann?
- 14. Wie stelle ich sicher, dass re.findall() an der richtigen Stelle stoppt?
- 15. Wie überwache ich meine Webanwendung?
- 16. Wie stelle ich sicher, dass R/Rcpp-Code reproduzierbar ist ("distributable")?
- 17. Ist meine Codeart sicher?
- 18. Ist dieser Code threadsicher? Wie kann ich es threadsicher machen?
- 19. Ist BlockingQueue vollständig threadsicher in Java
- 20. Java: threadsicher RandomAccessFile
- 21. Ist .NET System.Net.CookieContainer threadsicher?
- 22. mongodb Fehler: Wie stelle ich sicher, dass Ihr Tagebuch Verzeichnis gemountet ist
- 23. Sind Methodenparameter in Java threadsicher?
- 24. Ist Java TimeZone Thread-sicher?
- 25. Ist || = in Ruby threadsicher?
- 26. Wie threadsicher ist V4L2?
- 27. Ist MaC# doFinal() Thread-sicher in Java?
- 28. Wie stelle ich sicher, dass meine Plots die gleiche Achse teilen, während man in gnuplot ein Multiplot benutzt?
- 29. Wie stelle ich sicher, dass mein gesamtes Team genau die gleiche Version der .NET-Laufzeitumgebung hat?
- 30. Wie stelle ich sicher, dass die Datei nach dem Öffnen in Actionscript 3 geschlossen wird?
Eine Frage bezüglich "ein Servlet in der Web-App Lebenszeit" - Ich dachte, das war ein gepooltes Objekt, so Je nach Auslastung kann es im Ermessen der Servlet-Engine mehr als eins geben. Ist das nicht wahr? – duffymo
Nur wenn es implementiert (gemäß Servlet 2.4 veraltet) 'SingleThreadModel'. – BalusC
@BalusC: Vielen Dank Sir, diese Antwort hat mir endlich geholfen. Ich habe meine Frage gelöscht und Ihre Antwort aktualisiert. Es gibt niemanden wie dich in Java. Nochmals eine Million. –