„Hallo Amigo! Gestern haben wir die Vorteile und Annehmlichkeiten von Multithreading besprochen. Jetzt ist es Zeit, die Nachteile zu betrachten. Und leider gibt es da einige.“
Bisher haben wir ein Programm als eine Menge von Objekten betrachtet, die gegenseitig ihre Methoden aufrufen. Jetzt wird das alles ein wenig komplizierter. Ein Programm ist eher wie eine Menge von Objekten, durch die mehrere „kleine Roboter“ (Threads) hindurchlaufen und die in den Methoden enthaltenen Befehle ausführen.
Diese neue Interpretation macht die erste nicht ungültig. Es sind immer noch Objekte, und sie rufen immer noch die Methoden der anderen auf. Aber wir dürfen nicht vergessen, dass es mehrere Threads gibt, und jeder Thread seine eigene Arbeit oder Aufgabe macht.
Ein Programm wird immer komplizierter. Verschiedene Threads ändern den Zustand verschiedener Objekte basierend auf den Aufgaben, die sie ausführen. Und sie können sich gegenseitig auf die Füße treten.
Aber das Schlimmste passiert tief im Inneren der Java-Maschine. Wie ich bereits gesagt habe, wird die scheinbare Gleichzeitigkeit der Threads dadurch erreicht, dass der Prozessor ständig von einem Thread zum anderen wechselt. Er wechselt zu einem Thread, arbeitet 10 Millisekunden lang daran, schaltet zum nächsten Thread, arbeitet 10 Millisekunden lang daran und so weiter. Und hier liegt das Problem: Diese Umschaltvorgänge können zu den unpassendsten Zeitpunkten auftreten. Betrachte dieses Beispiel:
Code des ersten Threads | Code des zweiten Threads |
---|---|
|
|
Erwartete Ausgabe |
---|
Nick ist 15 Jahre alt Lena ist 21 Jahre alt |
Tatsächliche Code-Ausführung | Code des ersten Threads | Code des zweiten Threads |
---|---|---|
|
|
|
Was tatsächlich angezeigt wird |
---|
Nick ist Lena ist 15 21 Jahre alt Jahre alt |
Und hier ist ein weiteres Beispiel:
Code | Beschreibung |
---|---|
|
Die swap-Methode swap vertauscht die Werte der Variablen name1 und name2 .
Was könnte passieren, wenn sie von zwei Threads gleichzeitig aufgerufen wird? |
Tatsächliche Code-Ausführung | Code des ersten Threads | Code des zweiten Threads |
---|---|---|
|
|
|
Das Ergebnis |
---|
Beide Variablen haben den Wert ‚Lena‘. Das ‚Ally‘-Objekt hat es nicht geschafft. Es ist verloren. |
„Wer hätte gedacht, dass solche Fehler bei einer so einfachen Zuweisungsoperation möglich sind?!“
„Ja, für dieses Problem gibt es eine Lösung. Aber darüber reden wir später – meine Kehle ist trocken.“
GO TO FULL VERSION