Java Reference
In-Depth Information
Listing 12.2 Klasse Counter
package javacomp.servlets.application1;
public class Counter
{
private int counter;
public synchronized void increment()
{
counter++;
}
public synchronized void decrement()
{
counter--;
}
public synchronized void reset()
{
counter = 0;
}
public synchronized int get()
{
return counter;
}
}
Zur Initialisierung könnte man nun in irgendeinem der drei Servlets eine Methode init
anlegen und darin ein Counter-Objekt erzeugen und im ServletContext verankern. Um zu
garantieren, dass diese Initialisierungsmethode vor den Aufrufen von doGet bzw. doPost
der Servlets ausgeführt wird, würde man das Servlet, das die Initialisierung enthält, über
loadOnStartup entsprechend konfi gurieren. Das wäre die naheliegende und „schönste“ Her-
angehensweise zur Initialisierung. Um eine weitere Synchronisationsproblematik und ihre
Lösung darzustellen, soll im Folgenden jedoch eine andere Variante implementiert werden:
Dasjenige Servlet, das als erstes das Counter-Objekt benötigt, erzeugt dieses und legt es im
ServletContext ab. Zu diesem Zweck prü jedes Servlet, ob es schon ein Counter-Objekt im
ServletContext gibt. Wenn nicht, wird es erzeugt und gespeichert. Da diese Prüfung aber
von mehreren Threads (durch Methodenaufruf auf demselben und/oder unterschiedlichen
Servlet-Objekten) parallel durchgeführt werden kann, könnte es sein, dass auch versucht
wird die Initialisierung gleichzeitig mehrfach durchzuführen. Als Gegenmaßnahme wird
das Prüfen auf die Existenz eines Counter-Objekts und das eventuelle Initialisieren in einen
synchronisierten Programmblock gesetzt. Als ein von allen Servlet-Objekten gemeinsam
zugreifbares Objekt wird der ServletContext als Synchronisationsobjekt benutzt. Der Code
für das Servlet, welches die Web-Seite von Bild 12.3 erzeugt, ist in Listing 12.3 zu sehen.
Listing 12.3 Klasse DisplayServlet
package javacomp.servlets.application1;
import java.io.*;
import javax.servlet.*;
 
Search WWH ::




Custom Search