Theoretisch können JSP-Seiten über das Direktivitätsattribut isThreadSafe
page als threadsafe angezeigt werden. Wenn Sie den Wert false festlegen, wird der Container dazu veranlasst, den Zugriff auf Objekte auf Seitenebene zu synchronisieren (und nicht auf Objekte auf der Sitzungs- und Anwendungsbasis oder auf Objekte anderer Arten). Offensichtlich liegt es immer noch in der Verantwortung des Entwicklers, sicherzustellen, dass der synchrone Zugriff auf unsichere Codebereiche erfolgt.
Außerdem wurde die SingleThreadModel-Schnittstelle in der Servlet Specification-Version 2.4 ebenfalls als veraltet eingestuft. Die SingleThreadModel-Schnittstelle wird verwendet, um die vermeintliche Thread-Sicherheit in JSPs zu implementieren, da die generierten Servlet-Klassen das SingleThreadModel für JSPs implementieren, die das threadsafe-Attribut verwenden. Die Spezifikation selbst erläutert, warum die Schnittstelle veraltet ist:
SRV.2.2.1 Hinweis zum Einzelfadenmodell
Die Verwendung des SingleThreadModels Schnittstelle garantiert, dass nur einer Thread zu einem Zeitpunkt wird in a ausgeführt Servlet Instanz Service gegeben Methode. Es ist wichtig sich das zu merken Diese Garantie gilt nur für jeden Servlet-Instanz, seit dem Container kann wählen, solche Objekte zu poolen. Objekte, die für mehr zugänglich sind als eine Servlet-Instanz zu einer Zeit, wie Instanzen von HttpSession, möglicherweise zu einem bestimmten Zeitpunkt verfügbar sein mehrere Servlets, einschließlich solcher das implementieren SingleThreadModel.
Es wird empfohlen, dass ein Entwickler nimm andere Mittel, um diese zu lösen Probleme, anstatt dies zu implementieren Schnittstelle, wie die Verwendung zu vermeiden einer Instanzvariable oder Synchronisieren des Blocks des Codes Zugriff auf diese Ressourcen. Das SingleThreadModel-Schnittstelle ist in dieser Version der Spezifikation.
Zuerst die kurze Antwort & lt;% @ page isThreadSafe="false"% & gt;
Die längere Antwort ist, tu das nicht.
Sie müssen hier sehr klar über Ihr Ziel sein. Sie haben ein Servlet nicht threadsicher gemacht, indem Sie ein SingleThreadModel verwenden, sondern Sie haben Dinge eingerichtet, so dass immer nur ein Thread in Ihr Servlet gelangen kann. Vermutlich würden Sie das genau tun, weil der Servlet-Code nicht threadsicher ist, dh wenn mehr als ein Thread an den Code gelangen würde, würden schlimme Dinge passieren.
Das bedeutet für mich, dass Sie so etwas im Servlet-Code haben:
%Vor%Schließlich kann Ihr servvet-Code selbst nicht Thread-unsicher sein, sicher? Du würdest es reparieren, oder? Also muss es ein Legacy-Code sein, der Thread-unsicher ist?
Wenn in diesem Szenario Ihre JSP diesen vorhandenen Legacy-Code verwenden muss, haben Sie irgendwo in Ihrer JSP einen Anruf, der unsichere Sachen enthält:
%Vor%Sie müssen also nur diesen unsicheren Anruf schützen:
%Vor%Wenn Sie zulassen, dass der Großteil Ihrer JSP ordnungsgemäß ausgeführt wird, wird die Leistung viel besser.
Ich sollte auch sagen, dass, wenn Sie Ihre Anwendung als MVC strukturieren, dann alle Thread-unsafe-Code vom Controller aufgerufen wird und die Ansicht (die JSP) niemals unsicher sein muss.
Über Thread-Sicherheit mit JSP zu sprechen ist falsch - JSP ist eine Ansichtstechnologie und es zeigt nur Ergebnisse an - es führt keine Verarbeitung durch. (it kann verarbeiten, muss aber nicht)
Thread-Sicherheit mit Servlets wird durch no private Felder im Servlet erreicht - die Servlet-Instanz ist eine für den gesamten Container und jede Anfrage ist ein neuer Thread, der die Methode service(..)
aufruft.
Sie sollten genau angeben, was Sie in Ihrem Fall mit "thread-safety" meinen - d. h. was erwarten Sie wahrscheinlich nicht.
Sie nicht.
JSP ist im Grunde eine einzelne Methode in einem Servlet. Wie Sie vielleicht bereits wissen, sind Methoden threadsicher, da die beiden Threads, die dieselbe Methode desselben Objekts zur gleichen Zeit aufrufen, jede in ihrem eigenen Stack ausführen.
Sie müssen also nicht wirklich eine thread-sichere JSP erstellen, denn es ist bereits handelssicher.
Wenn Sie eine Variable a
in einer JSP deklarieren, gibt es keine Möglichkeit, eine andere Anfrage sieht diese Variable.
Was Sie beachten müssen, ist, dass Objekte in die Sitzung eingefügt werden, oder dass mehrere Threads gleichzeitig auf den Kontext zugreifen können, oder gar kein Thread-sicherer Code. Was Sie dann synchronisieren oder erledigen müssen, sind diese Objekte! und nicht die JSP-Seite.
Tags und Links java multithreading jsp servlets