|
Zwei Threads, die unsynchronisiert auf zwei Variablen zugreifen.
Dadurch entstehen falsche Berechnungen.
|
| |
|
Das gleiche Programm ohne künstliche Verzögerung
|
| |
|
Das gleiche Programm mit synchronisiertem Zugriff auf die
gemeinsamen Variablen.
|
| |
|
Das gleiche Programm ohne künstliche Verzögerung
|
| |
Testläufe |
Ein Testlauf des unsynchronisierten Programms
|
|
|
ohne Verzögerung |
|
|
Das gleiche Programm mit synchronisiertem Zugriff
|
|
|
ohne Verzögerung |
|
| |
|
Hier ist nicht sichergestellt, dass alle Werte, die vom Erzeuger
gesetzt werden, vom Verbraucher auch abgeholt werden.
Nur die Konsistenz der Daten im Puffer ist garantiert.
|
| |
|
Das gleiche Programm mit synchronisiertem Zugriff auf die
gemeinsamen Variablen und wait()
und notify() zur Sequenzialisierung
des Erzeugens und Verarbeitens.
|
| |
Testlauf |
Ein Testlauf des voll synchronisierten Programms
|
|
|
| |
|
Die gleichen Threads, nur mit 2 Erzeugern und 2 Verbrauchern.
Alle 4 arbeiten auf dem gemeinsamen Puffer.
|
|
Dies führt zu sehr viel mehr Synchronisationsaktionen,
insbesondere kann ein Erzeuger, anstatt eines Verbrauchers,
den anderen Erzeuger aus der
Warteschlange aufwecken.
|
|
Die Erzeuger und die Verbraucher sind untereinander
nicht synchronisiert, sie können also unabhängig voneinander
Werte erzeugen und verarbeiten.
|
| |
Testlauf |
Ein Testlauf des voll synchronisierten Programms
|
|
|
| |
|
|