2016-12-04 5 views
1

Was ich weißWie Multithreading in Webcontainern behandelt wird

Ein Web-Container erstellt einen neuen Thread pro Anfrage.

Was ich weiß nicht,

neue Servlet-Objekte pro Anfrage erstellt sind?

Warum frage ich das ist, um eine Idee zu bekommen, wie Thread-Synchronisation Probleme auftreten können, wenn das gleiche Servlet-Objekt für mehrere Anfragen verwendet wird. Wenn der Web-Container ein neues Servlet-Objekt für jede neue Anfrage erstellt, dann habe ich ' Ich sehe ein Problem. Wenn es jedoch dasselbe Servlet-Objekt verwendet, um mehrere Anforderungen zu bedienen, können Synchronisierungsprobleme auftreten.

Wie wird dies in einem typischen Java Web Container gehandhabt?

Antwort

2

Ein Web-Container erstellt einen neuen Thread pro Anforderung.

Nein. Es wird ein Thread aus einem Thread-Pool wiederverwendet.

Werden neue Servlet-Objekte pro Anforderung erstellt?

Nein. Ein Servlet ist ein Singleton. Pro Web-App wird nur eine Instanz erstellt. Ihr Servlet muss Thread-sicher sein, da es von mehreren Threads gleichzeitig aufgerufen wird. Aber das ist normalerweise einfach, weil ein Servlet typischerweise zustandslos ist.

1

Werden neue Servlet-Objekte pro Anforderung erstellt?

Der Servlet-Container erstellt standardmäßig eine einzelne Servlet-Instanz und wird verwendet, um alle Anforderungen in einem separaten Thread zu bedienen. Stellen Sie daher sicher, dass Ihre Servlet-Klasse Thread-sicher ist (d. H. Ihre Servlet-Klasse sollte keine statusbehafteten Daten als Instanzvariablen usw. enthalten).

Hinzufügen Servlet-Container erstellen die Servlet-Instanz entweder beim Start des Containers oder bei der ersten empfangenen Anforderung. Sie können den Container erzwingen, die Servlet-Instanz zu erstellen, indem Sie load-on-startup in web.xml oder @WebServlet(urlPatterns="/xyz", loadOnStartup=1)) angeben.

Es ist im Allgemeinen besser, die Servlets zu laden (es sei denn, Sie haben spezielle Anforderungen) mit load-on-startup, so dass die erste Anfrage nicht mit der Leistung trifft.

0

Im Allgemeinen Sinn Servlets sind Singletons, aber wenn Sie die gleiche Servlet-Klasse zu verschiedenen URL-Mappings unter Verwendung anderer Namen zuordnen, werden Sie so viele Instanzen desselben Servlet haben.

Meistens Servlets sind zustandslos, wenn Sie sie Stateful machen, dann seien Sie sehr vorsichtig bezüglich der gemeinsamen Veränderlichkeit. Frühere Servlet-API, über die SingleThreadModel-Schnittstelle einen einzelnen Threadzugriff zu einem bestimmten Zeitpunkt erzwingt, sodass Sie nur eine Anfrage gleichzeitig ausführen können. Allerdings ist diese Schnittstelle in den letzten APIs veraltet, da sie die Parallelität nicht behebt Probleme vollständig, wie statische Variablen usw.

Verwandte Themen