# isThreadSafe



## romzac (4. Jan 2008)

Nabend mal wieder zu so später Stunde.

Ich habe gelesen, dass von einem aus einer JSP erzeugten Servlet jeweils nur eine Instanz erzeugt wird, die für alle User verfügbar ist, die die gleiche URL aufrufen.

Abhilfe soll der Befehl @page isThreadSafe="true/false" schaffen.

Um das nachzuvollziehen habe ich mir in Eclipse folgendes Programm angelegt:


```
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%! int counter = 0; %>
<% counter++; %>
Aktueller Zähler:

<%= counter %>
</body>
</html>
```

Hier ist klar: im ersten WebBrowser von meinem PC aus wird als Zähler 1 angezeigt. Ein Aufruf aus dem Browser vom Laptop führt dazu, dass als Zähler bereits 2 angezeigt wird, obwohl ich es vom Laptop zum 1. Mal aufrufe, wa sich aufgrund der einmaligen Instanz aber auch erwartet habe. Soweit kapiert.

Nun habe ich eben besagte Zeile eingefügt:

```
<%@ page isThreadSafe="true" %>
```
in der Erwartung, es würden mehrere Threads des Servlets erzeugt, so dass das beide Aufrufe vom PC/Laptop als Zähler eine 1 anzeigen würden. Ist aber nicht der Fall, es wird trotzdem weiter gezählt. Habs dann auch noch mit ="false" probiert, bringt aber auch keine Abhilfe.

Was hab' ich falsch gemacht/missverstanden?

THX@ALL


----------



## HLX (5. Jan 2008)

Mehrere Servlets werden im Prinzip nur dann benötigt, wenn darauf gleichzeitige Zugriffe erfolgen. Außerdem kann der Server auch statt der Erzeugung des neuen Servlets warten, bis der 1. Aufruf beendet ist.

Um das zu testen, solltest du in die Verarbeitung ein längeres "Thread.sleep" einbauen und während dieser Schlafphase nochmals die JSP-Seite aufrufen.


----------



## maki (5. Jan 2008)

Mit isThreadSafe und SingleThreadModel würde ich keine Zeit verschwenden, kommen in der Realität nie vor, und wenn doch dann ist es ein Hinweis auf ernsthafte Probleme


----------



## ms (5. Jan 2008)

SingleThreadModel ist ausserdem seit JSP-Version 2.4 deprecated.

ms


----------



## romzac (6. Jan 2008)

Okay, das mit deprecated is'n gutes Argument !

Aber welches Vorgehen gibt es dann, z.B. den oben angesprochenen Zähler zu implementieren, der pro Aufrufer gilt? Also so, dass ich nur eine JSP schreibe, aber mehrere parallele Aufrufer starten jeder für sich selber mit counter=0.
Dass, wenn ein Benutzer selber auf aktualiseren klickt, und sich dann der Zähler erhöht, kann ja bleiben, nur die Zähler zwischen den Usern sollen sich halt nicht beeinflussen.


----------



## ms (6. Jan 2008)

Den Counter in die HttpSession legen.

ms


----------

