Frage zu Threads

Status
Nicht offen für weitere Antworten.

WeirdAl

Bekanntes Mitglied
Hi,
Im Bereich Threads habe ich recht wenig Erfahrung. Daher sorry falls diese Frage eigentlich zu den Anfängerfragen gehören sollte.
ich würde gerne wissen, ob ich unter den gleich folgenden "Umständen" in ein Threadproblem, d.h. mehrere Threads verändern das gleiche Objekt, laufen kann.

Der Einstieg erfolgt über ein Servlet, welches über keine Instanzvariablen verfügt. Alles geschieht in doPost. Innerhalb doPost erzeuge ich mir eine Objekt der Klasse A. Diese Klasse A enthält jetzt Instanzvariablen. Innerhalb des doPost werden diese Instanzvariablen manipuliert.

Pseudocode doPost:
Code:
// doPost ...
...

ClassAObject a = new ClassAObject();

a.setFile(file);
a.checkFile();
...

Pseudocode Klasse A:
Code:
...
// Instanzvariable
File tempFile = null;

public void setFile(File file){
this.tempFile = file;
}

public void checkFile(){
// checke manipuliere etc. das File
}
...

Im Prinzip denke ich eigentlich nicht das ich damit Probleme bekomme, da zwar durch den mehrfachen gleichzeitigen Zugriff auf das Servlet mehrere Threads gleichzeitig mit doPost arbeiten, aber alles was innerhalb doPost abläuft "atomar" sein sollte. Oder täusche ich mich da und der JVM optimiert innerhalb doPost rum und nutzt ab und ab das gleiche Objekt?

Ich habe gelesen das man generell, falls möglich, Instanzvariablen auf final setzen sollte. Final ermöglicht ja das einmalige setzen des Zeigers auf ein Objekt. Wenn ich jetzt das Tempfile im obigen Beispiel auf final setze, kann ich dem tempFile mit setFile noch einmalig das file in doPost zuordnen? Oder bekomme ich da Probleme, weil ich das tempFile schon mit null explizit initialisiert habe?

Gruß
Alex
 

tfa

Top Contributor
ClassAObject a ist doch eine lokale Variable in der doPost-Methode. Verstehe ich das richtig? In dem Fall ist Threading überhaupt kein Problem, da ja jeder Thread nur ein einziges dieser Objekte zu Gesicht bekommt.
 

WeirdAl

Bekanntes Mitglied
Hi,
ja das denke ich eigentlich auch, aber ich wurde von Kollegen so durcheinander gebracht, dass ich nicht mehr wusste/weiß, ob es nicht trotzdem zu solchen Problemen kommen kann.
Irgendwann kam mal auf, das wenn doPost zB. 50 mal gleichzeitig ausgeführt wird, nicht 50 Klasse A Objekte erzeugt werden würden, sondern es vorkommen könnte, dass ein Thread eine andere Klasse A mitbenutzt.
Daher wollte ich sicher gehen und hier nachfragen :)
 
M

maki

Gast
tempFile ist ein Problem, falls es aus doPost oder doGet geändert wird.

Instanzvaribalen sollten in Servlets nur gelesen werden!

EDIT: Falsch gelesen, achte tempFile wäre eine Instanzvariable des Servlets, es gibt kein Problem.
 

happy_robot

Bekanntes Mitglied
ob es hier zu "thread-problemen" kommen kann vermag man hier mit diesen informationen nicht sagen zu können.
jedes servlet ist aber sozusagen ein eigener "thread" mit eigenem adressraum und eigenen variablen, insofern diese nicht als static deklariert sind.

schau mal unter:

- synchronized
- ThreadLocal

das sollte vielleicht helfen.

zudem gäbe es auch die möglichkeit variablen in einer static hashmap mit der sessionid als key zu speichern. der zugriff sollte aber über synchronized-methoden erfolgen.
 

tfa

Top Contributor
WeirdAl hat gesagt.:
Irgendwann kam mal auf, das wenn doPost zB. 50 mal gleichzeitig ausgeführt wird, nicht 50 Klasse A Objekte erzeugt werden würden, sondern es vorkommen könnte, dass ein Thread eine andere Klasse A mitbenutzt.

Also das ist Blödsinn. Wenn eine Methode 50 mal aufgerufen wird, werden auch 50 mal die lokalen Variablen bzw. deren Objekte angelegt. Egal ob da Threads im Spiel sind oder nicht.
 

ms

Top Contributor
happy_robot hat gesagt.:
ob es hier zu "thread-problemen" kommen kann vermag man hier mit diesen informationen nicht sagen zu können.
jedes servlet ist aber sozusagen ein eigener "thread" mit eigenem adressraum und eigenen variablen, insofern diese nicht als static deklariert sind.
Nicht mal "sozusagen" ist ein Servlet ein Thread.
Es existiert nur ein Servlet zu Laufzeit welches von mehreren Threads benutzt wird. Daher sind gerade Instanzvariablen der Stolperstein (selber Adressraum), lokale Variablen dagegen machen keine Probleme.

ms
 

happy_robot

Bekanntes Mitglied
ms hat gesagt.:
Nicht mal "sozusagen" ist ein Servlet ein Thread.

war (und bin) mir da nicht so ganz sicher.

Code:
public abstract class GenericServlet extends java.lang.Object

ein runnable wird auch von HttpServlet nicht implementiert. ich glaube das das servlet eher als dispatcher agiert.
ich weiß es aber nicht wirklich, erscheint mir abner sinnvoller als als thread.
 

happy_robot

Bekanntes Mitglied
ms hat gesagt.:
Nicht mal "sozusagen" ist ein Servlet ein Thread.
könnte man doppeldeutig verstehen. bin aber auch etwas erkältet und vielleicht heute etwas begriffsstutzig :)

ms hat gesagt.:
Es existiert nur ein Servlet zu Laufzeit welches von mehreren Threads benutzt wird
diese würde ich aber wirklich in frage stellen. werde da aber mal nachforschen. das für mehrere tausende von anfragen in threads zu synchronisieren ist deutlich aufwendiger als das servlet zum dispatcher für threads zu machen. ist aber wie erwähnt meinerseits nur halbwissen. kann da durchaus falsch liegen.
 
M

maki

Gast
Mensch, steht doch alles in der Servlet Spec. ;)

Wenn es kein STM (SingleThreadModel) Servlet ist, bekommt jeder Request seinen eigenen Thread.
 

happy_robot

Bekanntes Mitglied
maki hat gesagt.:
Mensch, steht doch alles in der Servlet Spec. ;)

Wenn es kein STM (SingleThreadModel) Servlet ist, bekommt jeder Request seinen eigenen Thread.
jeder request einen thread? na das schliesse ich auch mal aus. ich glaube aber du meines Thread/Session.

ich hätte es nur so formuliert:

"Es existiert nur ein Servlet welches für jede Session einen eigenen Thread erzeugt und alle Requests zu den zugehörigen Threads weiterleitet"
 

Niki

Top Contributor
Ein Servlet erzeugt keinen Thread. Bei einem Request wird ein Thread erzeugt (bzw. ich nehme an es gibt einen Threadpool, da das erzeugen ja langsam ist) und dieser verwendet dann das Servlet. Mehrere Threads verwenden daher eine Instanz eines Servlets. Oder liege ich falsch?
 
M

maki

Gast
jeder request einen thread? na das schliesse ich auch mal aus. ich glaube aber du meines Thread/Session.
Ne, ich meinte schon ein Thread pro Request, dass diese aus einem Pool kommen sollten ist schon klar.
Aber da spielt die Session noch keine Rolle, wenn die Webapp keine Vorkehrungen getroffen hat, kann man zB auch aus einer Session gleichzeitig mehrere Requests abfeuern, das berüchtigte CTRL+N Problem ;)

Aus der Spezifikation:
SRV.2.1 Request Handling Methods
The basic Servlet interface defines a service method for handling client requests.
This method is called for each request that the servlet container routes to an instance of a servlet.
The handling of concurrent requests to a Web application generally requires that the Web Developer design servlets that can deal with multiple threads executing within the service method at a particular time.
Generally the Web container handles concurrent requests to the same servlet by concurrent execution of the service method on different threads.
Das es natürlich ein Limit an Threads gibt ist schon klar, kann man zB beim Tomcat konfgurieren.

@ Niki: Sehe ich auch so.
 

happy_robot

Bekanntes Mitglied
Niki hat gesagt.:
Bei einem Request wird ein Thread erzeugt
die frage ist ja ob bei JEDEM request ein thread erzeugt wird. ich würde vermuten daß für einen request ohne sessionid ein thread erzeugt wird der dann die session repräsentiert.

wenn JEDER request einen thread erzeugen würde müsste man den sinn hier ernsthaft hinterfragen, da seine lebensdauer nur für die zeit des requests sinnvoll wäre. und wo werden denn dann zum beispiel session-beans gehalten? wie werden requests den einzelnen sessions zugeordnet. oder noch fundamentaler...was ist denn dann eine session überhaupt?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
S Frage zu Threads (Sichtbarkeit und Verhalten) Allgemeine Java-Themen 11
M Runtime.exec() - Performance / Frage zu Threads Allgemeine Java-Themen 5
Q Frage zu Threads ( notify() wait() ) Allgemeine Java-Themen 6
S ExecutorService Frage (concurrent Threads) Allgemeine Java-Themen 4
M Frage zu Threads Allgemeine Java-Themen 11
T Frage zu Join bei Threads Allgemeine Java-Themen 3
F Gutes Threads Tutorial hier aber trotzdem eine Frage Allgemeine Java-Themen 7
M Frage zu Threads Allgemeine Java-Themen 3
S Frage zu Threads Allgemeine Java-Themen 5
M Frage zu Threads Allgemeine Java-Themen 2
MiMa Grundsätzliche Frage zur Verwendung von Java Versionen?? Allgemeine Java-Themen 3
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
W Timer Konzept-Frage Allgemeine Java-Themen 16
T Eine Frage des Designs Allgemeine Java-Themen 2
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
C Programmvorstellung & Frage zum Thema Geschäftsform Allgemeine Java-Themen 51
J Frage zu System.getproperties. Allgemeine Java-Themen 60
molat100 wie kann man die Frage beantworten Allgemeine Java-Themen 1
pkm Frage zur Präzision von Calendar.WEEK_OF_YEAR Allgemeine Java-Themen 12
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
F Frage zu System.in Allgemeine Java-Themen 3
marcooooo Frage zum Beispiel im Anhang Allgemeine Java-Themen 16
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
B For-Loop Frage Allgemeine Java-Themen 21
L Java frage Allgemeine Java-Themen 3
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
M Frage zum Konstruktor Allgemeine Java-Themen 2
W Best Practice Frage zur Umsetzung MVC Allgemeine Java-Themen 9
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
B Frage zu Unit-Tests Allgemeine Java-Themen 6
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
O Frage zum Runtimeverhalten von Java ... Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
D Frage zu Vererbung Allgemeine Java-Themen 5
J Frage zu regulärem Ausdruck Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Frage zur JLS Allgemeine Java-Themen 0
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3
E String Frage Allgemeine Java-Themen 9
I bin neu bei GitHub, Frage zur Sicherheit Allgemeine Java-Themen 14
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T Frage zu UML in Java programmieren Allgemeine Java-Themen 1
R Konstanten initialisieren - FRAGE Allgemeine Java-Themen 3
MTJ004 FTP Frage zu FTP Speicherung Java-Android-FTP Allgemeine Java-Themen 5
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
A Frage zu meinem Code Allgemeine Java-Themen 2
RalleYTN Classpath Nur ne kleine Frage zur MANIFEST.MF Allgemeine Java-Themen 4
T Frage zu Access Modifiers Allgemeine Java-Themen 6
W Input/Output Frage zu pdfbox und FileUtils Allgemeine Java-Themen 2
O Frage zur Implementierungsweise Allgemeine Java-Themen 4
B Frage zu Bitshift Allgemeine Java-Themen 3
J Java Zufallsgenerator (6 aus 49) Frage Allgemeine Java-Themen 7
L Frage zu RIA und GWT Allgemeine Java-Themen 0
P Concurrency Frage Allgemeine Java-Themen 8
M Frage zu Enumerations Allgemeine Java-Themen 2
F Unlimited Strength Policy. Frage Verbreitung der Anwendung Allgemeine Java-Themen 1
F Frage zur Library JTS Allgemeine Java-Themen 5
S Java Design Frage Allgemeine Java-Themen 10
E Reflection? Frage Allgemeine Java-Themen 4
C FileInputStream frage Allgemeine Java-Themen 6
G Polymorphie Programmdesign Frage Allgemeine Java-Themen 20
Uzi21 Frage zu NetBeans ( Console) Allgemeine Java-Themen 11
D Classpath Frage zum Java Resource Loading Allgemeine Java-Themen 2
G Frage zu JPA Allgemeine Java-Themen 1
S Methoden Frage Allgemeine Java-Themen 2
P MVC - Frage zu Model Allgemeine Java-Themen 4
K Frage zu Locks Allgemeine Java-Themen 1
S Frage zu abstract Allgemeine Java-Themen 5
M ArrayList<String> Frage Allgemeine Java-Themen 7
M OOP Design Frage Allgemeine Java-Themen 2
N Frage zur while-Schleife Allgemeine Java-Themen 18
T Best Practice Auslesen von Zeichenketten (Frage, Antworten, usw) Allgemeine Java-Themen 4
C Eine Frage zur Bearbeitungszeit Allgemeine Java-Themen 8
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2
T Garbage Collection Frage Allgemeine Java-Themen 15
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
D Frage zu Java und Umlauten / charsets Allgemeine Java-Themen 2
B Frage zu Java und OpenGL? Allgemeine Java-Themen 3
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
A eine test thread.join() frage Allgemeine Java-Themen 2
DStrohma LayoutManager Frage zum GridBagLayout Allgemeine Java-Themen 4
F Frage zu Regex möglich Allgemeine Java-Themen 4
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
D Frage und Antwort Programm, Problem bei Methodenaufruf Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Java Vector Frage Allgemeine Java-Themen 9
W Frage... Allgemeine Java-Themen 29

Ähnliche Java Themen

Neue Themen


Oben