# Threadsicherheit bei Servlet



## xrax (24. Jun 2008)

Hallo zusammen,

ich frage mich gerade ob dieses Servlet(ist nur ein fiktiver Codeschnipsel) nun Threadsicher wäre oder nicht. 

```
public class ComServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
	
	int i;
	String name;
	businessClass bc=new businessClass();  		

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	String queryString=req.getQueryString();
	i=bc.getID(queryString);
	String[] st=queryString.split("&");
	name=st[1];
	workMethod(i);
	}   
	
workMethode(int x){
System.out.println(name+" has ID: "+x);
}

}
```

Kann es passieren das 'i' von einem zweiten request geändert wird bevor der output stattfindet und somit 'name' vom erster request und 'i' vom zweiten request ausgegeben wird?

Wenn ja, - könnte das hier auch passieren?

```
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int i;
	String name;
	businessClass bc=new businessClass();  

	String queryString=req.getQueryString();
	i=bc.getID(queryString);
	String[] st=queryString.split("&");
	name=st[1];
	workMethod(i);
	}
```
Besten Dank
xrax


----------



## maki (24. Jun 2008)

> ch frage mich gerade ob dieses Servlet(ist nur ein fiktiver Codeschnipsel) nun Threadsicher wäre oder nicht.


Der Code ist nicht Threadsicher.

Das 2. Codebeispiel ist vielleicht threadsicher, dazu müsste man aber wissen was "businessClass" (schlechter Name btw.) macht, aber zumindest ist das Servlet OK.


----------



## @x.l (24. Jun 2008)

Stichwort synchronized


----------



## maki (24. Jun 2008)

synchronized im Servlet ist böse, lieber an die Regeln halten und keine Instanzvariablen haben welche nach der Initialisierung verändert werden.


----------



## xrax (24. Jun 2008)

maki hat gesagt.:
			
		

> Das 2. Codebeispiel ist vielleicht threadsicher, dazu müsste man aber wissen was "businessClass" (schlechter Name btw.) macht, aber zumindest ist das Servlet OK.



Ich habe jetzt (im real existierenden Servlet) die Instanzvariablen zu lokalen Variablen geändert.
Auch die beteiligten Objekte werden in den Methoden deklariert und erzeugt.
Diese Objekte schrieben nur was in die db und erzeugen Files.

Hoffe das es nun Threadsicher ist.
Gibts eigentlich einen test/methode um dies sicher herauszufinden?

Gruß und dank
xrax


----------



## byte (24. Jun 2008)

@x.l hat gesagt.:
			
		

> Stichwort synchronized


synchronized in einem Webcontainer? Das soll wohl ein Scherz sein!?

Die Lösung für solche Probleme lautet: _java.lang.ThreadLocal<T>_ ... oder halt zustandslose Objekte.


----------



## @x.l (24. Jun 2008)

byto hat gesagt.:
			
		

> synchronized in einem Webcontainer? Das soll wohl ein Scherz sein!?



hmm... war ja nur eine Idee! 

Was ist denn das Problem bei der Verwendung von synchronized in diesem Zusammenhang?


----------



## maki (24. Jun 2008)

Ein Server sollte eigentlich mehr als einen einzigen User auf einmal abhandeln können 

synchronized direkt ins Servlet zu schreiben ist da sehr suboptimal.


----------

