# static Methoden und synchronized



## kleinis_1 (23. Dezember 2005)

Hallo,

ich habe eine Sammlung von lauter "static Methoden" die verschiedene Funktionalitäten bereitstellen. Unter anderem werden auch Webservice aufgerufen.
Meine Frage ist nun ob ich alle Methoden synchronized machen muss weil sich sonst zeitgleiche Aufrufe gegenseitig beeinflussen würden. Oder gibt es da andere Lösungen.

Ich hab zum Beispiel eine Methode die einen Webservice aufruft welcher mir ein Objekt vom Server liefert das ich dann noch verarbeiten muss; entschlüsseln, deserialisieren und anderes.
Der entsprechende Methodenaufruf würde in einem eigenen Thread erfolgen und somit wären auch parallele Aufrufe möglich.
Hab zwar schon Thread-Programmierung gemacht aber bisher nur mit Objekten die instanziiert wurden.
Wär toll wenn mir jemand weiterhelfen könnte.

Ansonsten wünsch ich Euch allen ein frohes Fest und nochmal Danke für die viele Hilfe die man hier bekommt. Besonders an solche Dauerposter wie den Tom und  noch ein paar andere, echt toll wie Ihr Euch engagiert. Musste auch mal gesagt werden.

Gruß
Andi


----------



## kobi67 (23. Dezember 2005)

Hallo,

also bei Zugriffen auf Objekte, welche Statusbehaftet sind solltest Du auf jeden Fall mit synchronized arbeiten. Ein gutes Beispiel dafür wäre der Zugriff auf ein Bankkonto. Wenn zwei Threads paralell darauf zugreifen könnten und Transaktionen vornehmen, kann es zu inkonsitenten Zuständen kommen, da der eine Thread eventl. eine Abbuchung vorgenommen hat und der andere auf einem völlig falschem Kontostand arbeitet. 

Allg. Umsetzung:
Der erste aufrufende Thread bekommt ein Lock oder Monitor durch den die Methode für weitere Threads erst einmal gesperrt ist, d.h. für diese Threads wird die Methode wait() aufgerufen, wodurch sie in ein sog. Wait-Set wandern, wo sie so lange bleiben, bis der Thread , welcher den Monitor hält, die Methode notify() oder notifyAll() aufruft. 
Nachteil hieran ist, dass die freigebenen Threads nicht in ihrerer eingegangenen Reihenfolge weiterverarbeitet werden. Dafür müsste man ein eigenes Wait-Set realisieren. 
Irgendwo habe ich dafür auch noch ausreichend Beispiel-Code, leider gerade nicht zur hand. Bei Interesse kann ich es nochmal Posten.

Gruss
Kobi


----------



## Thomas Darimont (23. Dezember 2005)

Hallo!

 Wann immer du konkurrierende (manipulierende) Zugriffe auf einen Resource hast solltest du die Zugriffe sychronisieren. Manche Webservice Proxygeneratoren generieren per default schon Threadsichere Webservice Proxies... (einfach mal in der entsprechenden Doku nachschauen). Bei einem read only Webservice brauchst du allerdings keine groszartige Synchronisation...

 Wenn du trotzem unbedingt selbst sychnronisieren musst und du Java 5 verwenden darfst rate ich dir die java.util.concurrent Klassen anstatt eigener low level Synchronisierung (wati(), notify, synchronized...) zu verwenden. Wenn du Java < 1.5 verwenden musst solltest du Dir mal http://gee.cs.oswego.edu/dl/ anschauen (stellt die Ausgangsbasis fuer das concurrent Package in Java 5 dar).

    Gruss Tom


----------

