WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 02.11.2007, 10:25   #1
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard Tomcat Website - Java - Static Methoden - Threads?

Folgende grundlegende Frage:
Wir haben eine Tomcat Website wo der meiste Code in Code-Behind Java-Klassen steckt.

Jetzt gibt es eine Klasse die nur static-Methoden/Variablen hat um von überall Standardfunktionen ausführbar zu machen.

Jeder User der gleichzeitig auf den Server zugreift hat natürlich seinen eigenen Thread mit allen Instanzen die er braucht.

Die Frage ist, was ist mit den "static" Variablen/Methoden.
Meiner Meinung nach sind die von allen Threads her gleich und existieren daher systemweit nur 1x.

Daher könnte es z.B. zu Überschneidungen beim Zugriff auf Methoden geben, wenn diese nicht synchronized sind - ist das korrekt?
Bzw. würden sich Zugriffe gegenseitig blockieren wenn ich die Methoden synchronized mache und daher die Gesamtperformance verschlechtern.

Oder bin ich da auf dem Holzweg?
renew ist offline   Mit Zitat antworten
Alt 06.11.2007, 10:49   #2
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard

Um das Rätsel zu lösen - es ist so wie ich vermutet habe.

Die Static Variablen liegen nur einmal im Speicher. Sobald sich 2 Methodenaufrufe überschneiden kanns sein, dass der 2. Methodenaufruf die Variable vom 1. überschreibt.

Jetzt könnt ich das ganze natürlich synchronized machen, hätte dann aber den Bottleneck an dieser Methode da die immer von einem Thread ausgeführt wird und somit sich viele User gegenseitig ausbremsen.

Falls das jemanden interessiert.
renew ist offline   Mit Zitat antworten
Alt 16.11.2007, 18:44   #3
tschax2
Newbie
 
Registriert seit: 15.02.2005
Beiträge: 11


Standard

Das ist deshalb so, weil Tomcat ein Application Server ist, und du (im Gegensatz zu PHP) einen Application Context hast.

Zu deiner eigenen Antwort ergänzend: Wenn du eine Methode als synchronized definierst, garantierst du, dass nur ein Thread aktuell die Methode aufrufen kann.

Um eine feinere Regelung zu erzielen, kannst du mit dem Schlüsselwort synchronized auch einzelne Variablen sperren - im Beispiel sperrst du die aktuelle Instanz (this):

Code:
public void print(Point p) {
    float safeX, safeY;
    synchronized(this) {
        // Diese zwei Zeilen laufen
        // jetzt atomar ab
         safeX = p.x();    
         safeY = p.y();
    }
}
(Aus: http://jerry.c-lab.de/java/21Tage/kap18.htm)


Meistens trifft es bei Webanwendungen sowieso die Datenbank - hier solltest du aber eher auf den JDBC Connection Pool (für Datenbankverbindungen) und natürlich auf Transaktionen auf Datenbank-Ebene setzen.


Cheers, Thomas
tschax2 ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:12 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag