Re: einfaches Problem beim Synchronisieren



Danke für deine Ausführungen.

Kommt das davon her, dass durch wait das Schloß zeizweise wieder
aufgeschlossen wird (bis zum Aufruf von wait) und dadurch im anderen
Thread der synchronized Bereich abgearbeitet werden kann?

... (bis zum Ende des Aufrufes von wait()) ...

D.h. bis der Wartezustand beendet wird.

Du hast zwei ThreadCounter-Objekte, und jedes davon hat sein
eigenes MyLockObject, auf dem synchronisiert wird. Das hat
also in etwa den selben Effekt, als würdest du gar nicht
synchronisieren.
Dadurch kann es also vorkommen, dass die beiden Threads
parallel ihren synchronized-Block betreten, und dass
das dann (zufällig) so aussieht:

t1 t2 Zahl Ausgabe

2
zahl++ 3
(Merke 2)
zahl++ 4
(Merke 3)

println(3) 4 3
println(2) 4 2

(Dadurch, dass du hier zahl++ als Ausdruck
verwendest, wird das ganze gleich noch ein
Stück komplizierter, denn das hat ja als
Ergebnis den alten Wert, nicht den neuen.)

1)
Diesen Fall ("Dadurch, dass du hier zahl++ als Ausdruck...")
berücksichtigst du in deiner Erklärung. Ist das richtig?
2)
System.out.println(zahl++);
macht doch dasselbe wie
System.out.println(zahl);
zahl++;
Dann müsste aber in deiner letzten Zeile
println(2) 4 2
der akteulle Wert von zahl ausgegeben werden und das ist dann nicht
mehr 2, sondern 4.
Kann es also sein, dass also
System.out.println(zahl++);
und
System.out.println(zahl);
zahl++;
nicht dasselbe machen?

mfg
Ernst



.