„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
System.out.print ("Nick is");
System.out.print ("");
System.out.print ("15");
System.out.print ("");
System.out.print ("years old");
System.out.println ();
System.out.print ("Lena is");
System.out.print ("");
System.out.print ("21");
System.out.print ("");
System.out.print ("years old");
System.out.println ();
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
System.out.print ("Nick is");
System.out.print ("Lena is");
System.out.print (" ");
System.out.print (" ");
System.out.print ("15");
System.out.print ("21");
System.out.print (" ");
System.out.print (" ");
System.out.print ("years old");
System.out.println ();
System.out.print ("years old");
System.out.println ();
System.out.print ("Nick is");
//other thread is running
//other thread is running
System.out.print (" ");
System.out.print ("15");
//other thread is running
//other thread is running
System.out.print (" ");
System.out.print ("years old");
System.out.println ();
//other thread is running
//other thread is running
//other thread is running
System.out.print ("Lena is");
System.out.print (" ");
//other thread is running
//other thread is running
System.out.print ("21");
System.out.print (" ");
//other thread is running
//other thread is running
//other thread is running
System.out.print ("years old");
System.out.println ();
Was tatsächlich angezeigt wird
Nick ist Lena ist  15 21 Jahre alt
Jahre alt

Und hier ist ein weiteres Beispiel:

Code Beschreibung
class MyClass
{
private String name1 = "Ally";
private String name2 = "Lena";
public void swap()
{
String s = name1;
name1 = name2;
name2 = s;
}
}
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
String s1 = name1; //Ally
name1 = name2; //Lena
String s2 = name1; //Lena(!)
name1 = name2; //Lena
name2 = s1; //Ally
name2 = s2; //Lena
String s1 = name1;
name1 = name2;
//other thread is running
//other thread is running
name2 = s1;
//other thread is running
//other thread is running
//other thread is running
String s2 = name1;
name1 = name2;
//other thread is running
name2 = s2;
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.“