Threads und synchronized

Jens81

Gesperrter Benutzer
Hallo,

ich versuche mich gerade an Threads und Synchronisation mit einigen kleinen Testprogrammen.

Angenommen ich habe zwei Threads, A und B. A und B greifen unter anderem auf die Statische Funktion "DateToSqlDate" aus einer Klasse FormatUmwandlung zu.

Java:
public synchronized static java.sql.Date DateToSqlDate(Date in) {
		java.sql.Date out = new java.sql.Date(in.getTime());

		return out;
	}

Wird hier synchronized benötigt?

Bei lesenden Methoden brauche ich ja eigentlich keine sync wenn ich das richtig verstanden habe. Bei den Schreibenden bin ich mir nicht sicher, wann ich das Schlüsselwort benötige... (z.B. erst bei Zugriffen auf ein gemeinsames Objekt, z.B. eine Liste etc.?)
 
Zuletzt bearbeitet:

Atze

Top Contributor
wenn zwei threads auf die gleichen daten zugreifen sollte man grundsätzlich synchronisieren, auch bei den lesenden methoden, bzw wenn die gelesenen werte parallel modifiziert werden können. damit der eine thread nicht etwas liest, und bevor der wert verarbeitet ist, der andere thread diesen wert verändert.

natürlich ist es zwecklos wenn zwei threads nicht die gleichen methoden verwenden :)

in deinem beispiel wird synchronized gebraucht, weil beide threads ihr eigenes date mitbringen und (wenn sie an der falschen stelle unterbrochen werden) das out des nachfolgers wieder mit rausnehmen. korrigiert mich, wenn ich was falsches sage. :)
 
G

Gast2

Gast
wenn zwei threads auf die gleichen daten zugreifen sollte man grundsätzlich synchronisieren, auch bei den lesenden methoden, bzw wenn die gelesenen werte parallel modifiziert werden können. damit der eine thread nicht etwas liest, und bevor der wert verarbeitet ist, der andere thread diesen wert verändert.
jain ... wenn thread 1 nur liest um den aktuellen Fortschritt anzuzeigen ist das Banane ... wenn Thread 1 ,ot Werten arbeiten muss die Thread 2 erstellt, dann ja

in deinem beispiel wird synchronized gebraucht, weil beide threads ihr eigenes date mitbringen und (wenn sie an der falschen stelle unterbrochen werden) das out des nachfolgers wieder mit rausnehmen. korrigiert mich, wenn ich was falsches sage. :)
nein ... "Date in" existiert in dem Moment schon - für jeden Thread ... und das neue Date wird jedesmal auf dem Heap neu erzeugt - für jeden Thread ... btw: lokalen Variablen landen jedesmal auf den Stack des jeweiligen Threads

hand, mogel
 
S

SlaterB

Gast
@Atze
voll falsch gesehen ;)

die Methode ist nichts anderes als z.B.
double Math.sin(double)
und die will ja auch niemand synchronisieren bzw. kann auch niemand ändern

synchronisieren nur wenn auf gleiche Daten zugegriffen wird, hier etwa statische Variablen, was nicht passiert,
strenggenommen wäre denkbar, dass zwei Threads dasselbe Date-Objekt übergeben,
aber das ist dann erstens nicht das Problem dieser Methode, denn dann kann es ja überall Probleme mit dem Date-Objekt geben
und zweitens wird hier auch nur die Zeit ausgelesen, was selbst bei überlappenden Zugriff kein Problem machen sollte
 

Jens81

Gesperrter Benutzer
...wird synchronized gebraucht, weil beide threads ihr eigenes date mitbringen und (wenn sie an der falschen stelle unterbrochen werden) das out des nachfolgers wieder mit rausnehmen

Kann das noch jemand bestätigen? :) Das würde ja bedeuten das auch alle Getter, die mehr als einen möglichen Rückgabewert besitzen, synchronisiert werden müssten (Bisher ist zumindest nichts schief gegangen).
z.B. bei
Java:
public Date getLastModifiedDate(Typ typ) {
		switch (typ) {
			case TRAIN: return this.datumTrain;
			case VALID: return this.datumValid;
			case KLASS: return this.datumKlass;
			default: return null;
		}
	}


Edit: Ok, hat sich dann erledigt :)
Vielen Dank euch allen!
 
Zuletzt bearbeitet:

Atze

Top Contributor
ok, dann hab ich wohl mist erzählt :) sorry

ich hab jetzt so gedacht:

A kommt mit 10 uhr, out wird erzeugt, A wird unterbrochen
B kommt, erzeugt out mit 12 uhr, geht raus
A kann weitermachen, nimmt auch das 12 uhr out mit

war dann wohl n denkfehler, schande über mich :)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
denkbar wärs, zum Glück besteht diese Art Problem nicht, Code ist inmateriell,
die lokalen Variablen, auf die zugegriffen wird, hat jede Ausführung in ihrem lokalen Stack,
sonst ginge auch Rekursion nicht, ineinandergeschachteltes Ausführen derselben Methode
 

FArt

Top Contributor
@Atze
die Methode ist nichts anderes als z.B.
double Math.sin(double)
Kein gutes Beispiel. Die Methoden sind doch recht unterschiedlich ;-)

@Atze
strenggenommen wäre denkbar, dass zwei Threads dasselbe Date-Objekt übergeben,
aber das ist dann erstens nicht das Problem dieser Methode, denn dann kann es ja überall Probleme mit dem Date-Objekt geben
und zweitens wird hier auch nur die Zeit ausgelesen, was selbst bei überlappenden Zugriff kein Problem machen sollte
Nicht ganz. Dass java.util.Date leider nicht immutable ist unschön. Dadurch ist aber auch der lesende Zugriff getTime nicht threadsafe, denn der Wert ist ein long und das Attribut ist nicht volatile deklariert. Somit sollte in diesem Fall die Methode synchronisiert werden oder expliztit als nicht threadsafe gekennzeichnet sein. Wäre das Attribut immutable, wäre eine Synchronisation unnötig.
 
S

SlaterB

Gast
statische Methoden, die nur Parameter bearbeiten/ verwenden, gibt es in er API sicher tausende und ich habe noch keine einzige synchronisierte gesehen,
glaube FArts Ausführungen, zu welchem Zweck auch immer,
oder halte dich an die einfache Regel wie sie überall gilt: Synchronisation wenn auf Klassenattribute oder statische Attribute zugriffen wird
 

Atze

Top Contributor
also kann out nicht von beiden threads verändert werden, da jeder thread seinen eigenen stack hat und dort jeweils eins liegt, soweit richtig?
hört sich schlüssig an!
*edit2*
dachte bisher nur objekte landen grundsätzlich im heap, und nur primitives und methodenaufrufe auf dem stack. vielleicht ist das bei threads anders, und ich glaub das jetzt erstmal, bis ich nachgeschaut hab :)
-----
die rückgabe von in.getTime() kann von beiden threads bspw zur hälfte geschrieben sein, da das long nicht volatile ist. auch richtig?
hört sich auch gut an, aber was ich dann nicht versteh ist, beide threads können in dem beispielfall doch völlig interschiedliche Date objekte mitbringen. also wäre die einzige möglichkeit der vermischung, wenn das out erzeugt wird, also der wert als long an den sql.Date konstruktor übergeben wird. (dass halt der letzendliche long wert aus zwei aufrufen zusammengesetzt würde)
die beiden Date objekte an sich, also deren longs, werden doch im besten falle nur von einem thread mitgebracht? wann kann der andere da reinpfuschen?
oder denk ich ganz falsch?
gibts noch meinungen dazu?

*edit*
slater ist beim posten dazwischengerutscht :) also würd mich dann doch an slaters meinung halten, obwohl fart ja "auf meiner seite" ist! :/ aber slaters meinung ist (für mich) technisch besser nachzuvollziehen. vielleicht kann nochjemand was dazu sagen
 
Zuletzt bearbeitet:
S

SlaterB

Gast
FArt bezog sich glaube ich den Punkt
> strenggenommen wäre denkbar, dass zwei Threads dasselbe Date-Objekt übergeben

aber das hatte ich eigentlich nur zur Ergänzung erwähnt, danach kann man doch nicht gehen,
niemand würde Collections.sort(list) synchronized machen, nur weil der Anwender theoretisch zwei Threads starten kann, die dieselbe Liste zum Sortieren übergeben und da dann alles durcheinander geht

das muss die einzelne Methode nicht verhindern, außer man arbeitet explizit für solche Fälle

edit:
ok bei Date ist es etwas eher denkbar als bei List, weil man Dates üblicherweise gerne überall verteilt statt Kopien zu erstellen, Date wird wie ein unveränderlicher String oder ein primitiver Datentyp verwendet, ist es aber nicht,
naja, ganz extrem gedacht
 
Zuletzt bearbeitet von einem Moderator:

Atze

Top Contributor
*edit2*
dachte bisher nur objekte landen grundsätzlich im heap, und nur primitives und methodenaufrufe auf dem stack. vielleicht ist das bei threads anders, und ich glaub das jetzt erstmal, bis ich nachgeschaut hab :)

ich hab nachgeschaut :) und meine, habs richtig verstanden:
2 threads -> 2 jvm stacks mit jeweils 2 nicht (native method) frames -> 2 out referenzen auf 2 objekte in einem gemeinsamen heap!

hab ich irgendwas missverstanden?

VM Spec The Structure of the Java Virtual Machine

ab 3.5 wurds interessant :)
 
S

SlaterB

Gast
hm, das Thema nochmal, also du warst bei

> A kommt mit 10 uhr, out wird erzeugt, A wird unterbrochen
> B kommt, erzeugt out mit 12 uhr, geht raus

A und B kommen mit unterschiedlichen Dates auf dem Heap,
dass einer dieser Speicherplätze im Heap mit dem anderen überschrieben wird ist ja wenig realistisch,

> A kann weitermachen, nimmt auch das 12 uhr out mit

wenn dann könne man denken (so dachte ich in meinen Erklärungen zu deinen Gedenke ;) ),
dass für die fortgeführte Ausführung von A nun eine Referenz auf das zweite Objekt im Heap (von B) verwendet wird,

und diese Referenzen, die lokalen Variablen, die liegen auf dem Stack, daher ist dieser Fehler ausgeschlossen,
der Inhalt der Variablen, oft kb-große Objekte, liegt auf dem Heap, richtig,

ein Objekt kann ja von verschiedenen Variablen/ Referenzen aus angesprochen werden
 

Atze

Top Contributor
enn dann könne man denken (so dachte ich in meinen Erklärungen zu deinen Gedenke ;) ),
dass für die fortgeführte Ausführung von A nun eine Referenz auf das zweite Objekt im Heap (von B) verwendet wird,

ja, so ungefähr, ich hatte angenommen, das beide die gleiche referenz und somit das gleiche objekt verändern. hab nicht über 2 die eigenen frames, und somit über 2 objekte nachgedacht, wenn beide threads die gleiche methode (mein gedanke -> gleicher frame)
betreten. :/ danke :) vielleicht sollte ich mal öfter in die specs schauen :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Threads und synchronized Allgemeine Java-Themen 9
G synchronized + threads Allgemeine Java-Themen 12
rode45e Java Threads Allgemeine Java-Themen 4
M Threads Allgemeine Java-Themen 1
L Threads Threads in Chatroom Allgemeine Java-Themen 30
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
G Threads vom Mainprogramm steuern Allgemeine Java-Themen 8
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
x46 Threads Threads anhalten Allgemeine Java-Themen 1
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
W Threads Problem Allgemeine Java-Themen 15
T Threads Tic Tac Toe mit Threads Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
J Internet Broswer in Threads öffnen Allgemeine Java-Themen 1
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
D Threads Parallel laufende Threads Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
J Threads Threads Allgemeine Java-Themen 9
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
Tausendsassa Input/Output Problem mit der gleichzeitigen Ausgabe zweier Threads Allgemeine Java-Themen 8
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
M Threads JPanel eingeforen mit Threads Allgemeine Java-Themen 2
F Threads Allgemeine Java-Themen 6
F Threads Allgemeine Java-Themen 2
M Sinn von Threads? Allgemeine Java-Themen 1
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
P Threads Java Zugreifen Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
K KeyEvent in Threads Allgemeine Java-Themen 11
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
L Threads beenden Allgemeine Java-Themen 4
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
P 4 Threads in einer Methode Allgemeine Java-Themen 2
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
OnDemand Threads und synvhronized Allgemeine Java-Themen 2
S Problem mit Threads Allgemeine Java-Themen 1
W Threads Threads warten lassen Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
M Threads Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
A Problem mit der Synchronisierung von Threads Allgemeine Java-Themen 15
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
O Threads und If Befehle Allgemeine Java-Themen 7
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
C Threads und Exceptions Allgemeine Java-Themen 7
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16
E Threads Sudoku Threads Allgemeine Java-Themen 8
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
Gossi Threads mit unterschiedlichen Aufgaben in einer Klasse? Allgemeine Java-Themen 9
G Threads Ablauf von Threads im Spezialfall Allgemeine Java-Themen 4
V Threads bei quadcore Allgemeine Java-Themen 10
V 1000 Threads oder Iterativ? Allgemeine Java-Themen 11
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
B Threads Game of Life - Threads Allgemeine Java-Themen 49
R Threads Exceptions von Threads abfangen im ThreadPool Allgemeine Java-Themen 5
S Threads Ende sämtlicher Threads abwarten Allgemeine Java-Themen 6
S Frage zu Threads (Sichtbarkeit und Verhalten) Allgemeine Java-Themen 11
M Java-Threads und Datentypen-Zugriffe Allgemeine Java-Themen 7
P Threads- Programming Allgemeine Java-Themen 2
G Threads Klasse Sound und Threads bleiben hängen Allgemeine Java-Themen 4
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
M OutOfMemoryError in nebenläufigen Threads Allgemeine Java-Themen 6
M Threads dauerhafte bewegung mit threads Allgemeine Java-Themen 11
frankred Threads Auf eine Gruppe von Threads warten Allgemeine Java-Themen 11
J Eure Meinung: Threads verwenden, oder nicht? Allgemeine Java-Themen 6
K Warum wartet diese Funktion auf beenden des Threads? Allgemeine Java-Themen 3
F Mehrere Threads - ein Stack Allgemeine Java-Themen 6
O Wie kann ich das Ende eines Threads melden? Allgemeine Java-Themen 7
J Writer und Threads Allgemeine Java-Themen 2
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
E Verständnisfrage bezüglich Threads Allgemeine Java-Themen 4
K Zeitkritische Threads Allgemeine Java-Themen 14
K Threads - Swing - Synchronisation nötig? Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben